0

子クラスによって割り当てられた値を必要とするメソッドを持つ抽象クラスがあります。言う:

<?php

abstract class Foo {

    protected $value;

    /* .....  other required properties here */

    public function setValue($value) {
        $this->value=$value;
    }

    public function getProcessedValue() {
        // some processing here using $this->value;
        return $processed_value;
    } 

    /* .....  other public methods here using protected properties as inputs */     

} end of class Foo

class ChildFoo extends Foo {

    /* addtional code here */

}   //  end of class ChildFoo


// in main code

$child_foo=new ChildFoo();
$child_foo->setValue($value); /* how do you force this????? */
echo $child_foo->getProcessedValue();

?>

使用前に子クラスに保護されたプロパティを強制的に初期化するにはどうすればよいですか?

$child_foo->setValue($value); 

ここに私がやろうと考えているいくつかのことがあります:

1) setValue を抽象メソッドにする - これにより、開発者は setValue を子クラスに実装する必要がありますが、不適切に使用する可能性があります (DUH!)

2)コンストラクターに必要なパラメーターを含めることをお勧めするSOの投稿-これは機能する可能性がありますが、すでにsetValue()があるため冗長に見えます。同じオブジェクトを異なる入力に再利用できるように、setValue() を維持する予定です。

おそらくほとんどのプログラムに共通するこの問題のパターンはありますか?

4

1 に答える 1

1

コンストラクターでパラメーターを渡すことに同意します。なんで?さて、コンストラクタとは何でしょう?それはオブジェクトを構築するものです。ピザを作る場合は、生地を使って作る必要があります。他のすべての成分はオプションです。ピザ オブジェクトが生地に依存している場合は、コンストラクターを介して渡します。これがなければピザはピザとは言えないためです。ケチャップはどうですか?ケチャップはオプションです。そのため、これを使用してピザを作成しません。セッターを作成し、ユーザーが必要に応じてケチャップを設定 (追加) できるようにします。生地のセッターを作るべきですか?はい、まだピザを build() していないため、他のタイプの生地を設定するのにまだ遅すぎることはありません。

別の方法はありますか?おそらく。テンプレートメソッドなどを使用していますが、そうしても意味がありません。

于 2013-10-02T13:34:24.760 に答える