2

すべてのメソッドが実装されるわけではないシナリオで基本クラスから継承する場合、基本クラスに空のメソッドを配置して、そのメソッドを必要としないサブクラスがそれを完全に無視できるようにすることをお勧めしますが、他のクラスはオーバーライドする必要がありますメソッドを実装したい場合...例:

基本クラス:

public void myMethod() {
}

実装しないサブクラス:

<nothing!>

それとも、基本クラスをきれいなままにして、抽象メソッドを入れて、そのメソッドを実装していない場合、サブクラスに空のメソッドを強制的に肉付けする方が良いですか?

基本クラス:

public abstract void myMethod();

実装しないサブクラス:

public void myMethod() {
}
4

7 に答える 7

1

可能な限り、あなたはすべきです

抽象クラスよりもインターフェースを優先する

インターフェイスではメソッド実装を含めることができないため、いわゆるAbstract * Interface *があります。これは、両方の技術を組み合わせたものです。この場合、インターフェイスは型を定義し、抽象クラスは骨格の実装を提供します。
例として、骨格の実装を提供するコレクションフレームワークがあります。AbstractCollection, AbstractList, AbstractSet and AbstractMap.

詳細については、Josh Bloch、Effective Java 2nd Edition、Item18を参照してください。

于 2012-12-12T17:40:28.563 に答える
1

myMethod() に意味のあるデフォルトの実装があるかどうかにかかっていると思います。存在する場合は、それを基本クラスに配置し、サブクラスは別のものが必要な場合にのみオーバーライドします。

意味のあるデフォルトがなく、実際にはすべての非抽象サブクラスがメソッド自体を実装するか、中間クラスから実装を継承する必要がある場合、基本クラスに偽の実装を提供することは非常に悪い考えです。コンパイラが検出できたエラーを、テストによってのみ検出できるエラーに変換します。

場合によっては、考慮すべきオプションの 1 つとして、UnsupportedOperationException をスローするデフォルトの実装を提供することがあります。

于 2012-12-12T17:47:50.093 に答える
1

それはあなたの設計上の決定です。開発者に myMethod をオーバーライドさせてロジックを開発させたい場合。抽象クラスに行く必要があります。

于 2012-12-12T17:25:20.207 に答える
1

コーディングスタイルはあなた次第であり、要件に依存し、すべてに独自の長所と短所があります.

抽象クラスの場合、抽象メソッドだけを入れる必要はありません。インターフェイスを使用することをお勧めします。

于 2012-12-12T17:25:22.377 に答える
1

どちらも最も洗練されたソリューションではありませんが、どちらも仕事を成し遂げることができます。デザイン パターン戦略デザイン パターンを使用http://www.newthinktank.com/2012/08/strategy-design-pattern-tutorial/

于 2012-12-12T17:26:51.300 に答える
1

それはあなた次第であり、状況によって異なります。

抽象クラスがあり、それを拡張してそのメソッドを実装するクラスが必要な場合は、抽象メソッドを使用できます(抽象親クラスが抽象メソッドを使用するため、のようなものになる可能性がありますprint())。インターフェイスのメソッドに似ていますが、通常はさまざまなシナリオで使用されます。しかし、ほとんどの場合、インターフェイスを使用します...

抽象メソッドmyMethod()は、抽象親を拡張する各クラスで異なることを行う場合にのみ使用します...それ以外の場合、myMethod()通常は同じことを行い、1 つまたは 2 つのクラスがそれをオーバーライドする必要がある場合は、最初のソリューションを使用します。

テンプレート メソッド パターンも参照してください。どのケースがあなたのものか分からないので、この質問に正確に答えることはできません...

于 2012-12-12T17:27:52.180 に答える
0

抽象クラスの違いは、その関数をオーバーライドできるが、オーバーライドしてはならないことです。

したがってpublic void nothing() {}、オーバーライドすることができ、オーバーライドするpublic abstract void nothing2();必要があります。

于 2012-12-12T17:23:46.120 に答える