2

我正在尝试确定我正在使用的类结构的设计模式,但我对实现类设置的最佳方式感到困惑。

一种方法是在抽象类的构造函数中调用抽象设置函数,另一种是在扩展抽象类的类中重写构造函数。

几个(人为的和简化的)例子来概述我的想法:

调用抽象方法

<?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);
    }
}

优点:

  • 在设置车轮数据时,当查看具体类时立即显而易见。

缺点:

  • 在扩展抽象类时,可能会忽略需要设置车轮数据。
  • 在实现新的构造函数时需要记住调用父构造函数。
  • 需要在新构造函数中的正确位置调用父构造函数。
4

0 回答 0