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[]別の名前の配列に格納されていることを示します。私はこれを単純にしようとしているだけで、原則として興味があります。

よろしくお願いします!

4

3 に答える 3

13

アクセサメソッドを挿入する必要があると思います。つまり、次を使用します。

    for(String p : getStuff()) { 

スーパークラスで、次を追加します。

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

再定義があるところならどこでもprotected String[] stuff

オーバーライドは実際にはデータではなくメソッドに適用されます(少なくとも、Javaモデルではそうです。他の言語では動作が異なります)。したがって、オーバーライド効果を得るには、メソッド(通常はここのような単純なアクセサー)を挿入する必要があります。 )。これは実際にはまったく複雑ではありません。これは、Javaコンパイラに、必要な動作に必要な「余分なレベルの間接参照」を本質的に使用するように指示する非常に簡単な方法です。

于 2009-09-19T17:10:05.903 に答える
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" };
  }
}
于 2009-09-19T17:03:48.227 に答える
0

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

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();
    }
}
于 2014-07-26T18:04:12.050 に答える