2

このようなかなり単純なクラス A があるとしましょう -

public class A{
  private int randomField = 0;
  protected int key;
  protected double dmg;
}

ここで、保護されたフィールドを継承し、それらのフィールドに割り当てられた初期値に基づいてのみ異なるいくつかのサブクラスを作成したいと考えています。たとえば、2 つのサブクラス B と C を作成した場合、これら 2 つのサブクラスの唯一の違いは-classes は、値 key と dmg が異なる値を持つことです。それらは、同じ変数に影響を与えるという点でまったく同じメソッド set を共有します。

これらのサブクラスを作成しているときに、コンストラクターを変更して key と dmg に異なる初期値を設定し、set メソッドをコピーして貼り付けるだけなので、自分自身を繰り返していることに気付きます。

これを行う「良い」方法はありますか?

4

3 に答える 3

4

これは、サブクラス化すべき場所ではなく、実際には継承の過度の使用です。「サブクラス」間の唯一の違いがオブジェクトの初期状態である場合は、すべてに対して 1 つのクラスのみを使用し、代わりに単にコンストラクターまたはファクトリで状態を設定して、目的の状態のインスタンスを作成します。

例えば、

public class A{
  private int randomField = 0;
  private int key;
  private double dmg;

  public A(int key, double dmg) {
    this.key = key;
    this.dmg = dmg;
  }

  // getters and possibly setters...
}
于 2012-06-17T03:08:04.133 に答える
0

ここでサブクラス化する理由は絶対にありません。コンストラクターで異なる値を初期化するだけです。サブクラス化は、異なる機能で同じ動作をさせる必要がある場合に重要です。

例:

       Animal <--  Carnivores <-- Dog

ここでの Animal クラスは動物の重要な特徴を持ち、次に Carnivores クラスはより具体的になり、Dog は特定の動物です。

クラスAの2つのパラメーターを持つコンストラクターを使用することをお勧めします

public class A{
  private int randomField = 0;
  protected int key;
  protected double dmg;

 public A(int key, double dmg)
  {

     this.key = key;
     this.dmg = dmg;
  }
}
于 2012-06-17T03:14:19.743 に答える
0

サブクラスは必要ありませんが、インスタンスが必要です。

于 2012-06-17T03:09:56.533 に答える