我正在尝试设计一些类层次结构,并且我在这部分“陷入困境”.
让我们说我有以下课程
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 举报,一经查实,本站将立刻删除。