5

抽象クラスがAあり、すべてのサブクラスに特定のフィールドを持たせたいとします。抽象フィールドを定義できないため、これは Java では不可能です。

回避策 1:必要な値を提供するメソッドをサブクラスに強制的に実装させます。

abstract class A {
  abstract int getA();
}

欠点: 各サブクラスは、必要な抽象フィールドごとにメソッドを実装する必要があります。これにより、多くのメソッドが実装される可能性があります。

利点: メソッドgetAを抽象クラスで使用Aし、各サブクラスでメソッドを実装せずにメソッドを実装できます。ただし、メソッドの背後にある値は、抽象クラスによって上書きできません。

回避策 2:サブクラスに強制的に抽象クラスに値を与えることにより、抽象フィールドをシミュレートします。

abstract class A {
  int a;

  public A(int a) {
    this.a = a;
  }
}

欠点: 複数のフィールド (> 10) がある場合、スーパー コンストラクターの呼び出しは見栄えが悪く、ややこしくなります。

利点a:抽象クラスでフィールドを使用Aし、各サブクラスでメソッドを実装せずにメソッドを実装できます。さらに、値aは抽象クラスによって上書きできます。

質問:目標を達成するための一般的な方法はどれですか? たぶん、上記のものよりも良いものがありますか?

4

5 に答える 5

2

抽象メソッドは、おそらく最もオブジェクト指向です。

フィールドが多すぎる場合は、それらを POJO に再グループ化することをお勧めします (新しいコンセプトが適切な場合)。

于 2012-07-21T13:42:45.533 に答える
1

私は最初のものを好みます。私は、フィールド名でクラスを結合するのが好きではありません。状態をどのように処理し、どのように保存するかです。最初のものは、開始/終了プリンシパルにより近いです

継承を避けることをお勧めします。継承は非常に壊れやすく、メンテナンスが困難です。効果的な Java のアドバイスを覚えておいてください - 合成を好む 他の継承

于 2012-07-21T13:42:20.327 に答える
0

1.実際には、好みの問題ではなく、柔軟性と変化に適応する能力についてです。

2.変化し続ける動作をインターフェイスまたは抽象クラスにカプセル化することを常にお勧めします。

3.最初の回避策は、異なるクラスで同じ動作に対して異なる実装が必要な場所に適しています。次に、この場所では、インターフェイスまたは最初の回避策のいずれかが適切な選択になります。

例えば:

メソッドPaintingを持つクラスとpaint()見なします。

paint()メソッドには、ストローク、グライド、シェーディングなどのスタイルを設定できます。

次に、そのメソッドを抽象クラスまたはインターフェイスにカプセル化することをお勧めします。

public interface Paint{

paintDoIt(String style);

}

4. 2 番目の Wordaroundは、特定の動作をサブクラスで実装する必要がある場所に適しています。

例えば:

車を抽象クラスと考えてください。ステアリング、4輪、エンジンなどを持たなければならないことがto be car非常に重要です。したがって、これらの機能を実装する必要があります。

ミュージック システム、LCD などのその他の機能はオプションであり、車種によって異なります。

于 2012-07-21T15:03:11.210 に答える
0

回避策 2 は、次の 2 つの利点があるため、非常に一般的です。

1)あなたが言及したもの-フィールドはサブクラスに属していません-それは親に属しており、親によって「要求」され、親がそれを使用できるため、これは重要です

2) 親からサブクラス化する場合、コンストラクターを実装するときにそれを渡す必要があるため、このフィールドをよく認識しています。最初の回避策を見た場合、それから何を理解すればよいかわかりません。このようにして、親クラスが機能するにはこのフィールドが必要であるため、意味のある値が必要であることがわかります。

注: 初期化する必要がある 10 個のフィールドを持つクラスがある場合、設計に何か問題がある可能性があります。

于 2012-07-21T13:45:03.550 に答える
0

私は opt.1 がはるかにきれいだと思います。少数のゲッターとセッターは大した問題ではなく、多くのユースケースが単なるいくつかの抽象的な「フィールド」以上のものを持つとは思えません。

opt.2 については、コンストラクターが継承されないことを忘れているため、すべてのサブクラス コンストラクターをa考慮した方法で実装する必要があります。

于 2012-07-21T13:41:59.657 に答える