php - 抽象类-子类型

标签 php oop abstract-class hierarchy children

我正在尝试设计一些类层次结构,但我在这部分“卡住了”。

假设我有以下类(class)

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;
    }
}

在系统的不同部分,我有(解析器)类封装了创建 电影和节目对象并返回 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?)?

您的解决方案本身并不糟糕。但是,每当有人试图确定子类型来执行某些操作时,我往往会怀疑;为什么?这个答案可能有点理论化,甚至可能有点迂腐,但就这样吧。

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

  1. 您正在尝试根据子类型执行操作。通常,人们会选择将该操作移至类本身,而不是类“外部”。这也使得代码更易于管理。

  2. 您正试图通过使用继承来解决您自己引入的问题,而继承是没有必要的。如果有parent,又有children,每一个要用不同的方式,每一个都有不同的方法,就不要再使用继承了。他们不是同一类型。电影和电视剧不一样,甚至不一样。当然,您可以在电视上看到两者,但相似之处仅限于此。

如果您遇到第 2 个问题,您使用继承可能不是因为它有意义,而只是为了减少代码重复。这本身是一件好事,但您尝试这样做的方式可能不是最佳方式。如果可以的话,您可以改用组合,尽管除了一些任意的 getter 和 setter 之外,我怀疑重复的行为在哪里。

就是说,如果您的代码有效,并且您对此感到满意:那就去做吧。这个答案在如何处理 OO 方面是正确的,但我对您的应用程序的其余部分一无所知,所以答案是通用的。

关于php - 抽象类-子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10277317/

相关文章:

java - 如何对两种不同的文件格式运行单元测试?

java抽象类构造函数不会按预期工作

php - Mysql查询没有返回结果

php html渲染忽略样式

php - 提交表单时文件输入抛出错误

c++ - 错误 : no matching function for call to 'Subclass::...'

java - java中字符流有什么用?

c++ - OOP 是否鼓励良好的缓存,从而获得良好的性能?

php - 在使用 6 个连接表进行选择查询期间检索到错误的 ID

java - 覆盖抽象父类(super class)的 equal 和 hashCode