在没有抽象方法的抽象类或具有接口的基类之间进行选择时,我遇到了问题。
我有两种实现方式:
假设我有一个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
{
}
具有这样的基类和接口:
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
{
}
我不知道哪种方法是正确的,或者有更好的方法来实现,哪种方法各有利弊。
谢谢
答案 0 :(得分:0)
从Renderer客户的角度来看,这两种解决方案基本相同。只要它们依赖抽象对象(接口或抽象类),您就可以享受多态的好处。如果使它们依赖于WebRenderer(具体对象),则会丢失它们。
接口相对于抽象类的好处
提供的抽象类
静态方法(在许多语言界面中都没有这些方法)
受保护的实施