アイデアは、DOM のようなツリーを作成することです。ただし、特定のタイプのみが実際に他のタイプを含むことができるという制限があります。
インターフェイス | 抽象クラス | スーパークラスを使用して、appendChild、replaceChild などのよく知られている js 関数を実装したいと考えています。
ページ、ブロック、アイテムのクラスを使用しています。ページにはブロックを含めることができ、ブロックにはブロックまたはアイテムを含めることができます。
例: ページは Web ページ、ブロックはリスト要素、アイテムはリスト アイテム要素です。
しかし、これらのオブジェクトには単なる html データ以上のものが含まれており、その概念は単純な HTML 表現を超えています。これは、アイテムが実際の表現を持っているか、単に抽象的なオブジェクトであるかにかかわらず、アイテムを管理するための全体的なアイデアです。概念自体は、さまざまな階層で機能します。
私が達成したいのは、親クラスのコードをできるだけ再利用することです (子を追加することは基本的にすべてのクラスで同じです) が、子として追加できる型に一致するように型ヒントを変えることです。
基本的に、私が自分で見つけた4つの方法があります。
- スーパークラスにヒントを入力することはできますが、これらを変更することはできません。
- パブリック メソッドでスーパークラスを使用するので、型ヒントを再定義できます (これは、前提条件を継承するときの通常の慣行に完全に反します)。
- 私は保護されたメソッドを持つスーパークラスを使用していますが、これはまだ非常に風変わりなようです。
- スーパークラスを取り除き、ほぼ同じクラスを数回定義するだけです。
- 型ヒントの機能にもかかわらず、メソッドを使用して型を確認します。
それで、誰かがまだ答えてくれるなら、どのオプションを選ぶべきか、提案、アイデア、またはヒントを喜んで提供します. 問題を十分に説明できれば幸いです。
そして、私が見逃したことがあれば、それを聞いて感謝しています;)
コード
スーパークラスの方法 (機能しますが、慣習を継承する前提条件を破ります)
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);
}
}
編集部分は太字