0

アイデアは、DOM のようなツリーを作成することです。ただし、特定のタイプのみが実際に他のタイプを含むことができるという制限があります。

インターフェイス | 抽象クラス | スーパークラスを使用して、appendChild、replaceChild などのよく知られている js 関数を実装したいと考えています。

ページ、ブロック、アイテムのクラスを使用しています。ページにはブロックを含めることができ、ブロックにはブロックまたはアイテムを含めることができます。

例: ページは Web ページ、ブロックはリスト要素、アイテムはリスト アイテム要素です。

しかし、これらのオブジェクトには単なる html データ以上のものが含まれており、その概念は単純な HTML 表現を超えています。これは、アイテムが実際の表現を持っているか、単に抽象的なオブジェクトであるかにかかわらず、アイテムを管理するための全体的なアイデアです。概念自体は、さまざまな階層で機能します。

私が達成したいのは、親クラスのコードをできるだけ再利用することです (子を追加することは基本的にすべてのクラスで同じです) が、子として追加できる型に一致するように型ヒントを変えることです。

基本的に、私が自分で見つけた4つの方法があります。

  1. スーパークラスにヒントを入力することはできますが、これらを変更することはできません。
  2. パブリック メソッドでスーパークラスを使用するので、型ヒントを再定義できます (これは、前提条件を継承するときの通常の慣行に完全に反します)。
  3. 私は保護されたメソッドを持つスーパークラスを使用していますが、これはまだ非常に風変わりなようです。
  4. スーパークラスを取り除き、ほぼ同じクラスを数回定義するだけです。
  5. 型ヒントの機能にもかかわらず、メソッドを使用して型を確認します。

それで、誰かがまだ答えてくれるなら、どのオプションを選ぶべきか、提案、アイデア、またはヒントを喜んで提供します. 問題を十分に説明できれば幸いです。

そして、私が見逃したことがあれば、それを聞いて感謝しています;)

コード

スーパークラスの方法 (機能しますが、慣習を継承する前提条件を破ります)

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);
   }

}

編集部分は太字

4

1 に答える 1

0

インターフェイスは私にとって最も理にかなっています。複数のインターフェイスを実装できるため、1 つのクラスで複数の役割を果たすことができます。

// you don't need any methods in the interfaces
class Foo implements Inline, Block {} 

両方で動作します:

appendChild(Inline $foo); and appendChild(Block $foo);

インターフェイスは相互に拡張できるため、すべてのオブジェクトに共通のインターフェイスを使用できます。

継承を使用して実装を再利用することもできます。また、実装を再利用するために継承ツリーを厳密に使用する柔軟性があり、ページ ロジックに制限されることはありません ( StaticSimpletonextendを強制されることはありませんHeavyDatabaseyWidget)。

インターフェイスでない場合は、オプション 5 を選択します。appendChild呼び出しを行うだけで、$child->canBeChildOf($this)および/または$this->accepts($child). 繰り返しますが、ロジックと実装は独立しており、ロジックには多くの自由があります。

PHP は実行時に型チェックを行うため、型システムを使用してもあまりメリットはありません。

于 2010-01-28T23:57:36.700 に答える