0

抽象クラスを作成する代わりに、クラス A をインスタンス化したときに、クラス B の関数にアクセスするにはどうすればよいですか? この問題の最も簡単な解決策は何ですか?

    class A
    {
        public $a = 3;
        public function addup($var)
        {
            return ($var + $var);
        }
    }

    class B extends A
    {
        public function addup1($var)
        {
            return ($var * $var);
        }
    }


    $obj = new A();
    echo "Func from Class A: " . $obj->addup(3);
    echo "<br>";
    echo $obj->addup1(3);
    echo "<br><br><br><br>";



    $obj = new B();
    echo "Func from Class A: " . $obj->addup(3);
    echo "<br>";
    echo "Func from Class B: " . $obj->addup1(3);

    ?>
4

1 に答える 1

2

通常、できる/できないはずです。たとえば、クラスの車がある場合:

class Car {
    public function drive() {
        ...
    }
}

車は基本的に運転しかできません。彼は他のアクションを知りません。車はそれを拡張する他のクラスについて何も知りません。バットモービルを作成して Car を拡張しましょう。

class Batmobile extends Car {
    public function shoot() {
        ...
    }
}

バットモービルは機関銃で撃つことができます。これは、車ができるすべての機能 (この場合は運転) に追加されます。一方、通常の車$fiat = new Car();はバットモービルではないため、射撃することはできません。

あなたのケースに戻ります。A のインスタンスがある場合、そのすべての関数はこのクラス内で定義されます。メソッド addup1() はありません。現在、複数のオプションがあります。

  1. クラスを再設計してください。継承が適切に行われていない可能性があります。または、メソッド addup1() をクラス A に移動することもできます。
  2. php.netで誰かがコメントを投稿しました (あまり正確ではありません)。それにもかかわらず、addup1() が B の属性にアクセスしない限り、A でメソッドを作成し、B でメソッドを呼び出すことができます...このコメントを参照してください。

2 番目の解決策を実行することもできますが、お勧めしません。継承の考え方に反します。クラスについて再考し、多少変更することをお勧めします。

于 2012-06-26T06:40:07.533 に答える