2011-02-01 9 views
5

私は抽象クラスを作成していますが、サブクラスで定義する必要がある変数があります(この場合、スーパークラスで使用されるintです)。私はprotected変数をデフォルト値で定義するかどうかを決定できず、サブクラスがコンストラクタまたはsetterメソッドを通じて値を変更させるようにします。または、親クラスに抽象メソッドを定義して、すべてのサブクラスがそれを実装し、使用する値を返すようにする必要があります(抽象メソッドを使用してスーパークラスのメソッドにアクセスします)。一方の方法が他方より優先されるべき大きな理由があるかどうか誰にでも教えてください。サブクラスで指定する必要があるデータに抽象メソッドまたはインスタンス変数を使用する必要がありますか?

抽象メソッド:

public abstract int getValue(); 

public int getValue() { 
    return 5; 
} 
  • 長所:

軍サブクラスは、この値を考えると、彼らはそれになりたいものを選択します。

  • 短所:

デフォルト値はありませんが、そのサブクラスのほとんどがちょうど同じ値を使用したい場合でも、彼らはまだメソッドを実装する必要があります。

protected int value; 

public SubClassImpl() { 
    value = 5; 
} 
  • 長所::

    protected変数(メソッドは、非抽象作られ、デフォルト値を返しますが、その後は値を考えるようにサブクラスを強制する利点を失うことができます)

デフォルト値を定義することができ、サブクラスは気にしない場合でも無視することができます。

  • 短所:サブクラスの

著者は、変数の存在を知らされていないので、彼らは、デフォルトの動作に驚かれるかもしれません。

+1

値は不変ですか?そうでない場合、値を変更する責任は誰にありますか? –

+0

値が不変である必要はありませんが、オブジェクトの作成後に値が変更されるとは思われません。 – DaveJohnston

+0

他の視点から見てみるのが良いと思います。それを変更可能にする必要がなければ、それを不変にすることから始めます。要件が表示されたら、変更可能に変更します。 –

答えて

8

まあ、それは依存...

  • は、値は、オブジェクトの存続期間中に変更できるようにする必要がありますか?そうでない場合は、保護されたコンストラクターパラメーターにして、それを基底クラスの最終的なプライベート変数にすることができます。

  • サブクラスは、他の可変状態に基づいて変数を計算する理由がありますか?そうであれば、抽象ゲッターが適切であろう。

  • それ以外の場合は、おそらくプライベート変数と保護されたセッターを使用します。私は一般的に私的ではない変数のファンではありません。これにより、他のコンピュータフィールドの変更など、基本クラスの値の変更に対応することができます。デフォルト値が存在しないようにするには、これをコンストラクタパラメータと組み合わせて、後でセッターを介して変更できる初期値を強制します。それはあなたがcovariant return typesを利用することができますが、(変更可能)フィールドまたはプロパティがないので、私は通常、抽象メソッドを使用し

+2

+1 "保護されたコンストラクタパラメータ"オプション。 – Raedwald

+0

ありがとう、保護されたコンストラクタはおそらく私が行きたい方法です。 – DaveJohnston

関連する問題