ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

php – 抽象类 – 儿童类型

2019-05-30 14:20:12  阅读:291  来源: 互联网

标签:php oop hierarchy abstract-class children


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

让我们说我有以下课程

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是正确的,但我对你的其他应用程序一无所知,所以答案是通用的.

标签:php,oop,hierarchy,abstract-class,children
来源: https://codeday.me/bug/20190530/1183574.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有