0

私は明らかに継承を正しく理解していません。私のコードに話させます:

abstract class Calc {
private $x;
private $y;
public function AddNumbers() {      
    echo $this->x. " + " .$this->y;
}
}

class myCalc extends Calc {
public function __construct ($x,$y) {
    $this->x = $x;
    $this->y = $y;
   }
}

$calc1 = new myCalc(3,4);
$calc1->AddNumbers();
echo 'done';
exit;

OK、ここで何が起こっているのか: 2 つのプロパティ (x と y) と抽象メソッドを定義する抽象クラスが必要です (数値の連結は気にしないでください。メソッドの実装は私の質問) プロパティにアクセスします。

次に、具象クラスがその抽象クラスを拡張します。ご覧のとおり、プロパティに正常にアクセスして設定できますが、add numbers を呼び出すと、プロパティが設定されていないように見えます。

何が起こっているのですか、なぜこれが機能しないのですか、どうすれば修正できますか? 具体的なクラスで数値を追加するメソッドを定義することもできますが、再利用できる定義を持つ抽象クラスのメソッドが必要です。

ありがとう!

4

2 に答える 2

4

抽象クラスの 2 つのプロパティはプライベートです。つまり、このプロパティを拡張するクラスには存在せず、認識されません。

したがってMyCalc、これらのプロパティには書き込まれず、関数でそれらを読み取ることはできませんAddNumbers。コンストラクターは、MyCalc代わりに新しいパブリック プロパティを実際に作成します。

プロパティを「保護」すると、機能します。

于 2013-09-12T19:34:35.877 に答える
2

privateキーワードは、 のメソッドのみがこれらの変数を変更できることを定義しますCalc。のメソッドCalc およびそのサブクラスのいずれかのメソッドがそれらの変数にアクセスするようにするには、protected代わりにキーワードを使用します。

$this->xPHPでは、オブジェクトを宣言せずにメンバー変数を作成できるため、アクセスできます。これを行うと、結果のメンバー変数は暗黙的に宣言されますが、 で定義されpublicた変数とは関係がなく、 でスコープ内にありません。privateCalcmyCalc

于 2013-09-12T19:33:50.120 に答える