微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 抽象类 – 儿童类型

我正在尝试设计一些类层次结构,并且我在这部分“陷入困境”.

让我们说我有以下课程

abstract class Video 
{
    const TYPE_MOVIE = 1;
    const TYPE_SHOW  = 2;

    abstract public function getTitle();
    abstract public function getType();
}

class Movie extends Video 
{
    // ...

    public function getType() 
    {
        return self::TYPE_MOVIE;
    }
}

class Show extends Video 
{
    // ...

    public function getType() 
    {
        return self::TYPE_SHOW;
    }
}

在系统的不同部分,我有(Parser)类封装了创建
电影和节目对象并返回obj.给客户.

问题:获得一种obj的最佳方法是什么.从解析器/工厂类返回,以便客户端可以执行类似的操作

$video = $parser->getVideo('Dumb and Dumber');

echo $video->getTitle();

// Way 1
if($video->getType == 'show') {
    echo $video->getNbOfSeasons();
}

// Way 2
if($video instanceof Show) {
    echo $video->getNbOfSeasons();
}

// Current way
if($video->getType == Video::TYPE_SHOW) {
    echo $video->getNbOfSeasons();
}

有没有比我的解决方案更好的方法(读作:我的解决方案是否很糟糕?)?

解决方法:

Is there a better way than my solution (read as: does my solution suck?)?

你的解决方案本身并不笨拙.但是,每当有人试图确定子类型以执行某些操作时,我都会怀疑;为什么?这个答案可能有点理论上,甚至可能有点迂腐,但是这里也是如此.

你不应该在乎.父类和子类之间的关系是子类覆盖父类的行为. A parent class should always be substitutable by it’s children, regardless which one.如果你发现自己在问:我如何确定子类型,你通常会做两件事之一“错误”:

>您正在尝试根据子类型执行操作.通常,人们会选择将该动作移动到类本身,而不是类的“外部”.这也使得更易于管理的代码.
>您正试图通过使用继承来解决您自己介绍的问题,其中继承是不合理的.如果存在父级,并且存在子级,每个子级的使用方式不同,每个子级都有不同的方法,则只需停止使用继承.它们不是同一类型.一部电影与电视系列不一样,甚至不是很接近.当然,你可以在电视上看到两者,但相似之处就在那里停止了.

如果你遇到问题2,你可能使用继承不是因为它有意义,而只是为了减少代码重复.这本身就是一件好事,但你试图这样做的方式可能不是最佳的.如果可以的话,你可以使用组合,虽然我怀疑重复的行为会在哪里,除了一些任意的getter和setter.

也就是说,如果您的代码有效,并且您对此感到满意:那就去吧.这个答案对于如何处理OO是正确的,但我对你的其他应用程序一无所知,所以答案是通用的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐