PHP:从抽象类构造函数中调用'setup'抽象方法;设计好坏?

时间:2013-04-22 16:13:53

标签: php design-patterns constructor abstract-class

我正在尝试决定我正在使用的类结构的设计模式,并且我在实现类的设置的最佳方式上被撕裂。

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

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

调用抽象方法

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

优点:

  • 在设置车轮数据时立即查看具体类别。

缺点:

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

0 个答案:

没有答案