php - 如果只有 child 需要这些数据,那么将所有内容传递给基类是很好的选择吗?

标签 php inheritance

给定这个继承结构:

abstract class Base
{
    protected $version;

    public function __constructor($version)
    {
        $this->version = $version;
    }

    public abstract function doSql();
}

class MySQL extends Base
{
    public function doSql()
    {
        switch($this->version)
        {
             case 1 :
                 break;
             case 2 :
                 break;
        }
    }
}

class Oracle extends Base
{
    public function doSql()
    {
        switch($this->version)
        {
             case 1 :
                 break;
             case 2 :
                 break;
        }
    }
}

在这个例子中,$version将在所有子类中使用,但不会在基类中使用,所以我觉得它很臭。基础本身不需要$version。 重构后:

abstract class Base
{
    public abstract function doSql($version);
}

class MySQL extends Base
{
    public function doSql($version)
    {
        switch($version)
        {
             case 1 :
                 break;
             case 2 :
                 break;
        }
    }
}

class Oracle extends Base
{
    public function doSql($version)
    {
        switch($version)
        {
             case 1 :
                 break;
             case 2 :
                 break;
        }
    }
}

它稍微短一些,但我现在看不到任何优点 - 除了如果它已传递给构造函数,它将无法更改,而现在可以(有点不可变),所以它似乎更灵活。然而,不可变的类也是个好主意...... 何时使用哪种方法?

最佳答案

当属性属于一个类时,第一个更好。

当我们知道这一点时,这似乎是一件愚蠢的事情,但仔细想想。如果您使用版本作为大多数对象方法的参数,那么它很可能应该是一个属性。为对象分配一个唯一的属性更有意义,因为它允许在使用该类时设置更严格的规则。

例如开发人员 A 可以为每个方法传递不同的版本值,如果该类是一个数据库处理程序并且版本规定了他们使用哪个引擎,那么突然他们可以为每个函数指定 3 个不同的引擎,这对我来说意味着麻烦。

关于php - 如果只有 child 需要这些数据,那么将所有内容传递给基类是很好的选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57755655/

相关文章:

php - Laravel 准备语句 UPDATE 查询

php - 简单的日期函数在 php 中不起作用

php - 使用 PHP 调用 Virtualenv’ed Python 脚本

scala - 案例类继承有什么*严重*的错误?

c++ - 要在新类中使用另一个类,我应该继承吗?

C++:类的只读和只写版本的语义

php - 与 Paypal 的 PHP REST SDK 的支付协议(protocol)

php - 如何使用 ArangoDB 在 PHP 中进行用户注册和身份验证?

C++ 多重分派(dispatch)

java - 如何向下转换 Java 对象?