使用PHP 5.5,如果我指定了接口的层次结构和类的并行层次结构,我最终会得到通过多个关系继承某种类型的子类。这是否表明设计不佳?它会造成问题吗?
例如,请参阅代码:
interface foo {}
interface bar extends foo {}
class myFoo implements foo {}
class myBar extends myFoo implements bar {}
在这个例子中,myBar通过两种关系继承了“foo”类型:
我在接口和类之间存在一对一关系的原因是我可以在粒度级别上替换代理和模拟具体类。 (我的所有方法参数都以接口表示。)
我可以在接口中停止使用继承,但这似乎违背了多态性。此外,当我使用我的接口来定义方法签名时(即不仅仅是建立一个公共类型),它会产生问题。
答案 0 :(得分:1)
这两种方式都没有关系。从界面的“消费者”的角度来看,而不是从界面本身的抽象概念来看:
function (bar $bar) {
...
}
这是橡胶与接口相遇的道路。所有这个函数都感兴趣的是一个对象,它具有符合bar
接口中定义的方法的方法。它并不关心这个对象如何实现这些方法,只是它具有interface bar
定义的所有方法。无论是在接口还是在对象中,继承哪些方法都无关紧要。实例化对象的总和是最重要的。
话虽如此,您可能还想考虑一下您的界面和类设计。你正在做的事情本身并没有错,但可能是一种更好的接近接口的方法。不要将接口视为类的草图,将接口视为功能的定义。为此,再次考虑这种界面的消费者。例如:
function renderThumbnail(Imaginable $item) {
printf('<img src="%s">', $item->getHighestResolutionImage()->getUrl());
}
interface Imaginable {
/**
* @return Image[]
*/
public function getImages();
/**
* @return Image
*/
public function getHighestResolutionImage();
}
这演示了一个对象可能具有的一个特定功能。 任何对象可能都有关联的图像。任何实现Imaginable
接口的类只是声明它可以根据请求提供图像。 renderThumbnail
函数只需要任何具有图像的对象。将对象传递给它并不重要,该对象也可以实现其他几千种接口,并且可以是任何类型的类,重要的是它可以做到这一点。
如果您根据“-able
”功能接口来考虑它,很明显您可能不会最终得到两个并行运行的层次结构,这可能是更好的设计。 / p>