我正在尝试确定我正在使用的类结构的设计模式,但我对实现类设置的最佳方式感到困惑。
一种方法是在抽象类的构造函数中调用抽象设置函数,另一种是在扩展抽象类的类中重写构造函数。
几个(人为的和简化的)例子来概述我的想法:
调用抽象方法
<?php
abstract class VehicleAbstract implements VehicleInterface
{
protected $_wheels;
private $_engine;
public function __construct(EngineInterface $engine)
{
$this->setupWheels();
$this->_engine = $engine;
$this->_engine->setWheelsToDrive($this->_wheels);
}
public abstract function setupWheels();
}
class Car extends VehicleAbstract
{
public function setupWheels()
{
$this->_wheels = array(
"frontL",
"frontR",
"backL",
"backR"
);
}
}
优点:
- 在实现具体类时,很明显需要创建方法“setupWheels”。
- 只有设置代码需要写在“setupWheels”方法中。
缺点:
- 在实现时,如果不查看父类,“setupWheels”需要做什么可能不会立即显而易见。
- 新查看扩展类的人可能没有意识到在创建类时调用了该方法。
重写构造函数
<?php
abstract class VehicleAbstract implements VehicleInterface
{
protected $_wheels;
private $_engine;
public function __construct(EngineInterface $engine)
{
$this->_engine = $engine;
$this->_engine->setWheelsToDrive($this->_wheels);
}
}
class Car extends VehicleAbstract
{
public function __construct(EngineInterface $engine)
{
$this->_wheels = array(
"frontL",
"frontR",
"backL",
"backR"
);
parent::__construct($engine);
}
}
优点:
- 在设置车轮数据时,当查看具体类时立即显而易见。
缺点:
- 在扩展抽象类时,可能会忽略需要设置车轮数据。
- 在实现新的构造函数时需要记住调用父构造函数。
- 需要在新构造函数中的正确位置调用父构造函数。