3

私は一日中答えを探していましたが、見つけられないようです。意味が分からなかったらごめんなさい、私はこれで頭がおかしくなりました。

これが私がやろうとしていることです:

abstract class Parent {
    abstract public function Test();
}
class Child1 extends Parent {
    abstract public function Test() {
        echo "Test!";
    }
}
class Child2 extends Parent {
    public function Test2() {
        echo "Test2!";
        $this->Test(); // Child1::Test();
    }
}

繰り返しますが、私があまり意味をなしていない場合は申し訳ありません。必要があれば、もっと説明しようと思います。

4

5 に答える 5

1

抽象クラスとメソッドの概念がありません。

抽象クラス

抽象クラスは、いくつかの基本的な動作を定義するクラスであり、インスタンス化することはできません。それらはサブクラス化されるように設計されています。

抽象メソッド

これらは、拡張クラスによって実装する必要があるメソッドです。インターフェイスと同様に、抽象メソッドは実装なしで動作を定義します。

あなたのコード

コードで、抽象メソッドを使用して抽象クラスを宣言しました。

abstract class Parent {
    public abstract function Test();
}

別のクラスがサブクラス化する場合Parent、抽象メソッドを実装して具体化する必要があります。

class Child extends Parent {
    public function Test() {
        echo "Test!";
    }
}

兄弟メソッドへのアクセス

クラスまたはインスタンスには兄弟の概念がありません。クラスは、誰がその親をサブクラス化し、静的な方法でアクセスするかを知ることができません。

于 2013-08-04T20:07:17.360 に答える
1

これは OOP パターンではなく、私が知っている OOP 言語では利用できません (イントロスペクション マジックを除く): Child2 は Child1 クラスについて何も知りません (そして知る必要もありません)。それらは独立して定義できます。

この時点で、ニーズが何であるかを説明する必要があると思います。いくつかのデザインパターンでお手伝いできると思います。

于 2013-08-04T20:01:11.663 に答える
0

Testオーバーライドされた関数は、(定義しているように) 抽象的であってはなりChild1 ません。use の関数からのTest関数を呼び出すには:Child1Test2Child2

Child1 foo = new Child1();
echo foo->Test();

関係があるからではなく、publicとして定義されているからこそできることです。Child1Child2

于 2013-08-04T20:05:50.227 に答える