我正在尝试设计一些类层次结构,但我在这部分“卡住了”。
假设我有以下类(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 .如果您发现自己在问:我如何确定子类型,您通常会做以下两件事之一:
您正在尝试根据子类型执行操作。通常,人们会选择将该操作移至类本身,而不是类“外部”。这也使得代码更易于管理。
您正试图通过使用继承来解决您自己引入的问题,而继承是没有必要的。如果有parent,又有children,每一个要用不同的方式,每一个都有不同的方法,就不要再使用继承了。他们不是同一类型。电影和电视剧不一样,甚至不一样。当然,您可以在电视上看到两者,但相似之处仅限于此。
如果您遇到第 2 个问题,您使用继承可能不是因为它有意义,而只是为了减少代码重复。这本身是一件好事,但您尝试这样做的方式可能不是最佳方式。如果可以的话,您可以改用组合,尽管除了一些任意的 getter 和 setter 之外,我怀疑重复的行为在哪里。
就是说,如果您的代码有效,并且您对此感到满意:那就去做吧。这个答案在如何处理 OO 方面是正确的,但我对您的应用程序的其余部分一无所知,所以答案是通用的。
关于php - 抽象类-子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10277317/