2017-06-16 7 views
-2

私は継承の問題があります。私は親クラスAと、Aからの派生クラスBと、Aからの派生クラスCをもう一度考えてみましょう。PHP OOP継承問題

は、クラスAからの両方のオーバーライドメソッドの種子は()も)全て(seedAll静的関数を実装& & B CをclasesクラスB & C、のように言ってみましょう。

私の質問は次のとおりです。将来的には、私はクラスB & Cに似たクラスDを持つべきであるように、どのように私は、明示的にクラスB & Cを指定せずにseedAll関数からseedAll B & Cのために呼ぶのですか、私はクラスBのseedAll機能を呼び出すために、クラスAのseedAll機能を変更する必要はありません、C & D.

abstract class A 
{ 
    public static function seedAll() { 
     //How do I call seedAll of all the derived classes of Seeder? 
    } 

    abstract protected function seed(); 
    // // Common method 
    // public function printOut() { 
    //  print $this->getValue() . "\n"; 
    // } 
} 

class B extends A 
{ 
    private $name; 

    function __construct($name) { 
     $this->name = $name; 
    } 

    public static function seedAll() { 
     $seeder1 = new B("name1"); 
     $seeder1 = new B("name2"); 
    } 

    function seed() { 
     echo $this->name; 
    } 
} 


    class C extends A 
    { 
     private $name; 

     function __construct($name) { 
      $this->name = $name; 
     } 

     public static function seedAll() { 
      $seeder1 = new C("name1"); 
      $seeder1 = new C("name2"); 
     } 

     function seed() { 
      echo $this->name; 
     } 
    } 
+1

それはあなたがからそれを呼び出しているどのオブジェクトに依存する場合には、静的メソッドではありません。 – Barmar

+0

静的メソッド、基本クラスの静的メソッド、または派生クラスの静的メソッドではいけないものはどれですか?あなたはもっと明確になりますか? – Hirvesh

+1

'seed()'メソッドはこれにどのように関連していますか?コードを表示することができますか、どのような結果を得ようとしていますか? – Barmar

答えて

2

は、すべてのサブクラスを取得する方法についてはhow to obtain all subclasses of a class in phpを参照してください。ループして、seedAll()メソッドを呼び出すことができます。

abstract class A 
{ 
    public static function seedAll() { 
     $subclasses = getSubclassesOf("A"); 
     foreach ($subclasses as $class) { 
      $class::seedAll(); 
     } 
    } 

    abstract protected function seed(); 
    // // Common method 
    // public function printOut() { 
    //  print $this->getValue() . "\n"; 
    // } 
} 

getSubclassesOf機能:

function getSubclassesOf($parent) { 
    $result = array(); 
    foreach (get_declared_classes() as $class) { 
     if (is_subclass_of($class, $parent)) 
      $result[] = $class; 
    } 
    return $result; 
} 
+0

いくつかの警告:(1)オートローディングの使用は、この関数が呼び出されたときにいくつかのクラスが分からないことを意味します。(2)OPが任意のサブクラスで 'seedAll'を実装するのを忘れた場合、無限再帰が発生します。しかし、OPはそれを頼んだので、それは "買い手が注意する"ような状況です。 – apokryfos

+0

@apokryfosありがとう!私はこれを念頭に置いておきます – Hirvesh

+0

@Barmar私はあなたの答えを受け入れたものとしてマークしますが、getSubclassesOf関数はPHP標準ライブラリの一部ではないことがわかります。 – Hirvesh