1

私は Java と OOP の初心者です。

クラス A でプライベート サブクラス (実際には構造体) B を使用していましたが、サブクラス B の親クラス C を作成することを決定するまで、すべてがうまくいきました。クラス C の保護されたメンバーの一部を公開したいと考えています。

例えば:

public class A {
   private class B extends C {
       public int product;
       public int x;
       public int y;
       public void add() {
             product=x+y;
       }
   }
   B b=new B;
   b.x=1;
   b.y=2;
   b.multiply();
   System.out.println(b.product+"="+b.x+"x"+b.y);

public class C {
   protected int x;
   protected int y;
   public int sum;
   public C(px,py) {
       x=px;
       y=py;
   }
   public void sum() {
       sum=x+y;
   }
}

そして、私は得る

暗黙のスーパー コンストラクター C() は、既定のコンストラクターに対して未定義です。明示的なコンストラクターを定義する必要があります

もちろん、extend C を削除して、以前の状態に戻すこともできます。または、ゲッター/セッターを作成することもできます。しかし、内部構造体が受け入れられ、他のクラスを拡張できるはずであることは理解できると思います。

4

2 に答える 2

5

コンパイラのメッセージはかなり明確です - B では効果的に次のようになります。

public B() {
    super();
}

Cには呼び出すパラメータのないコンストラクタがないため、これは失敗します。パラメーターなしのコンストラクターを導入するか、適切な引数で C のコンストラクターを呼び出す明示的なコンストラクターを B に提供します。

これらすべての非プライベート フィールドをすべて持つのが良い考えかどうかはわかりませんが、B のフィールドが C のフィールドを非表示にするのも良い考えではありません。Bのインスタンスに 2 つのxフィールドと2つのyフィールド?別々のフィールドになることがわかりますね。

パブリック アクセスを効果的に提供したいだけの場合は、次のようにすることができます。

public void setX(int x) {
    this.x = x;
}

public int getX() {
    return x;
}

(および についても同じy) B から余分なフィールドを削除します。ただし、C のフィールドの実際のアクセス可能性を変更することはできません。

于 2010-02-04T09:48:54.017 に答える
0

さて、私は自分のコードをいじっていましたが、問題はスーパークラス C の保護されたデフォルト コンストラクターが必要であることがわかりました。

于 2010-02-04T09:49:59.330 に答える