2009-09-19 4 views
4

Javaでは、サブクラスのメンバーデータをオーバーライドし、そのオーバーライドされたバージョンをスーパークラスの実装で使用されるデータにすることは可能ですか?言い換えればサブクラスのメンバーデータをオーバーライドし、スーパークラスの実装で使用しますか?

は、ここで私が起こることを取得しようとしています、そしてそれは起こっていないものです:

abstract public class BasicStuff { 
     protected String[] stuff = { "Pizza", "Shoes" }; 

     public void readStuff() { 
       for(String p : stuff) { 
         system.out.println(p); 
       } 
     } 
} 

..

public class HardStuff extends BasicStuff { 
     protected String[] stuff = { "Harmonica", "Saxophone", "Particle Accelerator" }; 
} 

この呼び出し:

HardStuff sf = new HardStuff(); 
sf.readStuff(); 

。 .. PizzaShoesを印刷します。代わりに後者を印刷したい。

これは階層的なOOの実践ではないことを認識しています。非常に特殊なケースのために、私はXMLの設定と反映を使って何かをしていました。

これを実行できる修飾語はありますか?

はい、私はサブクラスでこの問題を回避するために、つまりstuff[]の内容が別の名前の配列に格納されていることを示すことによって使用できるラッパーがあることを認識しています。私はこれを単純にしておきたいと思っていますし、原理的には好奇心です。

ありがとうございます!

答えて

13

を私はつまり、あなたがアクセサメソッドを挿入しなければならないと信じて、使用:

for(String p : getStuff()) { 

をスーパークラスに追加し、次のように追加します。

protected String[] getStuff() { return stuff; } 

protected String[] stuff再定義がある場合はどこでも可能です。

オーバーライドは実際にはデータには当てはまりません(少なくともJavaモデルではそうですが、他の言語ではやり方が異なります)。オーバーライド効果を得るには、メソッド(通常は汚れ - ここのようなシンプルなアクセサ)。まったく複雑なことではありません。Javaコンパイラに、本質的に、必要な振る舞いに必要な「間接レベルの追加レベル」を使用するように指示する単純な方法です。

4

このようにして、定義済みのもので親変数を隠すことになります。

(またはコンストラクタで)初期化ブロック内のものに価値を与えてみてください。

abstract public class BasicStuff { 
    protected String[] stuff; 

    { 
    stuff = new String[] { "Pizza", "Shoes" }; 
    } 

    public void readStuff() { 
    for(String p : stuff) { 
     System.out.println(p); 
    } 
    } 
} 

..

public class HardStuff extends BasicStuff { 
    { 
    stuff = new String[] { "Harmonica", "Saxophone", "Particle Accelerator" }; 
    } 
} 
+0

これは定義に従って上書きされていないが、子供のメンバ変数の値を変更するこのソリューションは、あなたが(例えば、テーマをサポートするためのDecoratorパターン)をオーバーライドするために多くの変数を持っている場合にははるかにエレガントです。 +1 – humbleSapiens

0

派生クラスで定義されたString Stuffの配列を印刷する場合は、クラスHardStuffのメソッドを再定義して、HardStuffクラスのreadStuffメソッドをオーバーライドする必要があります。 readStuffメソッドは抽象クラスBasicStuffで定義されていたため、BasicStuffクラスのメンバーのみを出力します。したがって、derievedクラスにも同じメソッドを追加してください。 以下は完全なコードを見つけることができます..

class BasicStuff { 
    protected String[] stuff = { "Pizza", "Shoes" }; 

    public void readStuff() { 
      for(String p : stuff) { 
        System.out.println(p); 
      } 
    } 
} 


public class HardStuff extends BasicStuff { 
    protected String[] stuff = 
       { "Harmonica", 
       "Saxophone", 
       "Particle Accelerator" 
       }; 

    public void readStuff() { 
      for(String p : stuff) { 
        System.out.println(p); 
      } 
    } 
    public static void main(String []arg) 
    { 
    HardStuff sf = new HardStuff(); 
     sf.readStuff(); 
    } 
} 
関連する問題