给定这个继承结构:
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/