这个想法是创建一个类似 DOM 的树。但是有一些限制,只有某些类型实际上可以包含其他类型。
我想使用接口|抽象类|超类来实现一些众所周知的 js 函数,如 appendChild、replaceChild 等。
我正在使用类页面、块和项目,其中页面可以包含块,块可以包含块或项目。
示例:Page 是网页,block 可以是列表元素,item 可以是列表项元素。
但这些对象不仅仅包含 html 数据,而且这些概念不仅仅是纯 HTML 表示。这是管理项目的总体思路,无论它们具有实际表示还是只是抽象对象。这个概念本身适用于许多不同的层次结构。
我想要实现的是尽可能多地重用父类的代码(添加子类对所有类基本相同),但不同的类型提示以匹配作为子类添加的允许类型。
我发现自己基本上有四种方法:
- 我使用一个接口,它允许我输入超类的提示,但不能更改这些。
- 我使用带有公共方法的超类,所以我可以重新定义类型提示(这在继承先决条件时完全违背了通常的做法)。
- 我使用带有受保护方法的超类,这似乎仍然很古怪。
- 我摆脱了任何超类,只是多次定义几乎相同的类。
- 尽管有类型提示的功能,但我使用一种方法来检查类型。
所以,如果有人仍然愿意回答,我很高兴有任何提议、想法或提示,选择哪个选项。我希望我能很好地描述这个问题。
如果有什么我错过了,我很感激听到它;)
代码
超类方式(有效,但打破了先决条件继承实践)
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);
}
}
编辑部分加粗