1

特定のプログラムについて、私は基本的にいくつかの異なるサブクラスを持つ抽象スーパークラスを持っています。ただし、以下に示すように、フィールド シャドーイングに問題があります。

abstract class Super {
   String name;

   String getName() {
       return name;
    }
}

次に、それぞれ独自の「名前」を持つサブクラスを作成します。

class Sub extends Super {
    name = "Subclass";
}

ただし、サブクラスのインスタンスを作成し、継承されたメソッド getName() を呼び出すと、フィールドのシャドーイングのために null が生成されます。

この問題を回避し、サブクラスがそれぞれ継承されたメソッドによってアクセスできる一意のフィールドを持つことを許可する簡単な方法はありますか?

4

2 に答える 2

0

フィールドを子クラスで可視にし、サブクラス コンストラクターまたはサブクラス インスタンス初期化子で初期化します。

于 2014-05-30T23:12:43.743 に答える
0

このメカニズムを試すことができます (おまけは読者にお任せします。コードを拡張して、クラスの名前を直接取得します)。このコードは、Abstract クラスのコンストラクターを使用して名前を設定します。Super クラスで setName 関数を定義して使用することもできます。

スーパークラス(抽象)

package stackShadow;
public abstract class Super {
    String name;

    public Super(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

Shadow1 クラスの最初のサブクラス

package stackShadow;
public class Shadow1 extends Super {
    public Shadow1() {
        super("Shadow1");
    }
}

Shadow2 クラスの第 2 サブクラス

package stackShadow;
public class Shadow2 extends Super {
    public Shadow2() {
        super("Shadow2");
    }
}

クラスをテストして、getName パッケージの stackShadow をテストします。

public class Test {

    public static void main(String[] args) {
        Shadow1 one = new Shadow1();
        Shadow2 two = new Shadow2();

        System.out.println("Name for one is: " + one.getName());
        System.out.println("Name for two is: " + two.getName());

    }

}
于 2014-05-30T23:35:07.303 に答える