2

このコンストラクターを持つスーパークラスがあります。

public Super(String p){
    String[] result = p.split(",");
    setA(result[0]);
    setB(result[1]);
    setC(result[2]);
    setD(result[3]);
    setE(result[4]);
}

次に、同じコンストラクターを使用したいサブクラスがありますが、さらに 2 つの文字列を追加します。これは私のコードです:

public Sub(String d){
    super(d);
    setF(result[5]);
    setG(result[6]);
}

このコードを使用すると、結果が指定されていないというエラーが発生します。どうすればこれを修正できますか?

4

1 に答える 1

3

基本的に、サブクラス コンストラクターで分割を再度行う必要があります。サブクラス コンストラクターではローカル変数resultを使用できません。

public Sub(String d){
    super(d);
    String[] result = d.split(",");
    setF(result[5]);
    setG(result[6]);
}

はい、作業が重複することになりますが、それを避けるのはやや困難です。を受け取るプライベート サブクラス コンストラクターとString[]、最初に分割を行うファクトリ メソッドを使用することで、これを行うことができます。

protected Super(String[] result) {
    setA(result[0]);
    setB(result[1]);
    setC(result[2]);
    setD(result[3]);
    setE(result[4]);
}

protected Super(String d) {
    this(d.split(","));
}

...
private Sub(String[] result) {
    super(result);
    setF(result[5]);
    setG(result[6]); 
}

public static Sub fromString(String d) {
    return new Sub(d.split(","));
}

スーパークラスのコンストラクターが、サブクラスでオーバーライドされる仮想メソッドを呼び出す代替オプションがありますが、これは非常に壊れやすく、例を提供するつもりもないほど恐ろしいものです

于 2015-03-18T19:47:20.800 に答える