在阅读http://php.net/manual/en/language.oop5.interfaces.php之后,我不确定何时应该扩展接口或使用多个接口或使用接口扩展类。用什么标准来确定采取哪种方法?
<?php
interface Interface_A
{
public function aaa();
}
interface Interface_B
{
public function bbb();
}
interface Interface_C extends Interface_A
{
public function bbb();
}
class Class_A implements Interface_A, Interface_B
{
public function aaa(){}
public function bbb(){}
}
class Class_B implements Interface_C
{
public function aaa(){}
public function bbb(){}
}
class Class_C implements Interface_A
{
public function aaa(){}
}
class Class_D extends Class_C implements Interface_B
{
//public function aaa(){} //Use parent
public function bbb(){}
}
答案 0 :(得分:1)
我认为,一个好的方法是默认关注Composition over inheritance和Interface segregation principle。对于大多数情况,这会自动排除 &#34;扩展接口&#34; 和&#34;使用接口&#34; 扩展类。对于其余的情况,一如既往,取决于。
接口是契约,因此当类实现接口时,它会显示其具有适当方法的其他类。这为Liskov substitution principle提供了基础。
从您的示例:
如果您的某些课程依赖于aaa()
方法,而您的某些课程依赖于aaa()
和bbb()
方法,而且没有一个课程仅依靠bbb()
事实上,你可以扩展Interface_A
,从而将方法添加到它。
如果之前的所有课程都保留,但有些课程还单独依赖bbb()
,那么最好有Interface_A
和Interface_B
。如果你想用一个接口强制执行这两个方法,你可以创建组合的一个:
interface Interface_C扩展了Interface_A,Interface_B {
}
这是我的主观意见,但是从理解的角度来看,扩展类和实现界面有点复杂,并没有真正有用(或者我说不是很实用)。通常,您实现了一个接口,以便您可以键入提示。如果您键入提示Interface_B
并且您的Class_D
实现了它,那么您不应该关心此类是否实现任何其他接口。这意味着,您可以将Class_C
作为Class_D
的依赖项,并且可以完全避免使用继承。