web-dev-qa-db-ja.com

スーパークラスのインスタンス変数をオーバーライドする

サブクラスのスーパークラスのインスタンス変数をオーバーライドできないのはなぜですか?

27
Warrior

データメンバーの実装を変更すると、スーパークラスが壊れる可能性があるためです(スーパークラスのデータメンバーをfloatからStringに変更することを想像してください)。

21
cletus

彼はおそらく、以前に使用された値を試してオーバーライドすることを意味していました 初期化する 変数。例えば、

これの代わりに(これは違法です)

public abstract class A {
    String help = "**no help defined -- somebody should change that***";
    // ...
}
// ...
public class B extends A {
    // ILLEGAL
    @Override
    String help = "some fancy help message for B";
    // ...
}

やるべき

public abstract class A {
    public String getHelp() {
        return "**no help defined -- somebody should change that***";
    }
    // ...
}
// ...
public class B extends A {
    @Override
    public String getHelp() {
        return "some fancy help message for B";
    // ...
}
49
Pierre D

なぜなら、構造を変更するのではなく、動作を上書きするだけだからです。オブジェクトが作成され、メモリが割り当てられると、構造が確定します。もちろん、これは通常、静的に型付けされた言語に当てはまります。

9
Adrian Zanescu

変数は多態的にアクセスされません。これを使用して、保護された変数では実行できないことは何ですか? (個人的には、プライベートではない可変変数を使用することをお勧めします。)

5
Jon Skeet
class Dad{
    public String name = "Dad";
}
class Son extends Dad{
    public String name = "Son";
    public String getName(){
        return this.name;
    }
}

呼び出した場合はmain()メソッドから

new Son().getName();

これは「Son」を返しますこれは、スーパークラスの変数をオーバーライドする方法です。

2
ssi-anik

たとえば、オーバーライドして、データ型を変更したいですか?

この表現で何をしますか

public class A {
   protected int mIndex;

   public void counter(){
      mIndex++;
   }

}

public class B extends A {
   protected String mIndex; // Or what you mean with overloading
}

演算子のオーバーロードなどを行わずにmIndex ++式をどのように変更しますか?.

0
Markus Lausberg

インスタンス変数をオーバーライドする必要がある場合は、ほとんどの場合、weargクラスから継承しています。

一部の言語では、新しい変数を指定してインスタンス変数を非表示にすることができます。

class A has variable V1 of type X;

class B inherits from A, but reintroduces V1 of type Y.

クラスAのメソッドは、引き続き元のV1にアクセスできます。クラスBのメソッドは、新しいV1にアクセスできます。そして、オリジナルにアクセスしたい場合は、クラスAに自分自身をキャストできます(ご存じのように、ダーティプログラミングはよりダーティなプログラミングを引き起こします)。

最善の解決策は、変数の別の名前を見つけることです。

0
Toon Krijthe

インスタンス変数の構造をオーバーライドすることはできませんが、その動作はオーバーライドします:-

class A
{
int x = 5;
}

class B extends A
{
int x = 7:
}

class Main
{
public static void main(String dh[])
{
A obj = new B();
System.out.println(obj.x);
}
}

この場合の出力は5です。

0
dheeraj

メソッドをオーバーライドできますが、それでも問題ありませんが、変数をオーバーライドするとはどういう意味ですか?スーパークラスではなく他の場所で変数を使用する場合は、uを使用できます。スーパー(変数名)のように;なぜ変数をオーバーライドしたいのですか?何か必要があるということですか?

0
mahanuz