这个想法是创建一个类似DOM的树。但是有一些限制,只有某些类型实际上可以包含另一种类型。
我想使用接口|抽象类|超类来实现一些众所周知的js函数如appendChild,replaceChild等。
我正在使用类页面,块和项目,其中页面可以包含块,块可以包含块或项目。
示例:Page是一个网页,block可以是list元素,item可以是list item元素。
但是这些对象不仅包含html数据,而且概念不仅仅是简单的HTML表示。 这是管理项目的总体思路,他们有实际的表现形式,或者只是抽象的对象。该概念本身适用于许多不同的层次结构。
我想要实现的是尽可能多地重用父类的代码(为所有类添加一个子元素基本相同)但是要使类型提示不同以匹配允许添加为子类的类型。< / p>
我基本上有四种方法可以找到自己:
所以,如果有人仍然愿意回答我很高兴任何提议,想法或提示,选择哪个选项。我希望我能够很好地描述这个问题。
如果有什么我错过了,我很感激听到它;)
代码
超级方式(有效,但打破前提条件继承练习)
class Base {
public|protected function appendChild(Base $child) {
// do stuff
}
}
class Block extends Base {
public function appendChild(Block $child) {
parent::appendChild($child);
}
}
接口方式(不起作用。一定不能)
interface Interface1 {
public function appendChild(Base $child);
}
class Base implements Interface1 {
public|protected function appendChild(Base $child) {
// do stuff
}
}
class Block extends Base{
public function appendChild(Block $child) {
parent::appendChild($child);
}
}
编辑的部分为粗体
答案 0 :(得分:0)
界面对我来说最有意义。您可以拥有一个扮演多个角色的类,因为它可以实现多个接口。
// you don't need any methods in the interfaces
class Foo implements Inline, Block {}
将同时适用于:
appendChild(Inline $foo); and appendChild(Block $foo);
和接口可以相互扩展,因此可以为所有对象提供通用接口。
您仍然可以使用继承来重用实现,并且您可以灵活地使用inhertiance树来严格重用实现,而不受页面逻辑的限制(您永远不会被迫StaticSimpleton
扩展{ {1}})。
如果不是界面,我会选择选项5:只需拨打HeavyDatabaseyWidget
来拨打appendChild
和/或$child->canBeChildOf($this)
。同样,逻辑和实现将是独立的,你的逻辑将有很多自由。
PHP在运行tmie时会进行类型检查,所以使用类型系统并不会给你带来太多帮助。