没有抽象方法的基类或抽象类

时间:2019-11-17 10:04:59

标签: oop interface abstract-class

在没有抽象方法的抽象类或具有接口的基类之间进行选择时,我遇到了问题。

我有两种实现方式:

1。

假设我有一个AbstractRenderer

abstract class AbstractRenderer
{

    protected $shape;

    public function __construct(AbstractShape $shape)
    {
        $this->shape = $shape;
    }

    public function render(): string
    {
        return $this->shape->generate()->asArray();
    }
}

和WebRenderer会像这样:

class WebRenderer extends AbstractRenderer
{

}

2。

具有这样的基类和接口:

Interface InterfaceRenderer
{
   public function __construct(AbstractShape $shape);
   public function render(): string;
}

和阻碍接口的基类:

class BaseRenderer implements InterfaceRenderer
{
        protected $shape;

        public function __construct(AbstractShape $shape)
        {
            $this->shape = $shape;
        }

        public function render(): string
        {
            return $this->shape->generate()->toString();
        }
}

再次,我的WebRenderer会像这样:

class WebRenderer extends BaseRenderer
{

}

我不知道哪种方法是正确的,或者有更好的方法来实现,哪种方法各有利弊。

谢谢

1 个答案:

答案 0 :(得分:0)

从Renderer客户的角度来看,这两种解决方案基本相同。只要它们依赖抽象对象(接口或抽象类),您就可以享受多态的好处。如果使它们依赖于WebRenderer(具体对象),则会丢失它们。

接口相对于抽象类的好处

  • 没有继承
  • 没有脆弱的基类问题

提供的抽象类

  • 静态方法(在许多语言界面中都没有这些方法)

  • 受保护的实施