2016-05-16 4 views
0

例えば、私はすべてのメソッドが必要な多くのクラスを持っています。 このメソッドでは、これらのクラスはすべて1行のコードを必要とし、残りのメソッドは異なります。抽象メソッドの部分実装ですか?

void method(){ 
    everybodyDoesThisStuff; 

    // more individual stuff 

    // more individual stuff 
} 

抽象メソッドは、身体を持つことができない、とあなたはそれが抽象的にするためにでなかった場合は、メソッドをオーバーライドして、それを失うことになります。

どのように私はこのような何かを達成することができました。

+0

everybodyDoesThisStuffを 'method()'の各オーバーライダーから明示的に呼び出すメソッドに引き出す以外の方法はありません。 –

+0

は 'individualStuff()'と 'moreIndividualStuff()'を抽象メソッドにして、 'method()'からそれらを呼び出します。 – aioobe

+0

@LouisWassermanはい、私は現在やっていることです、私はちょうど上記のようなものが可能だったかと思っていた。この方法で、私は100種類のクラスでそのメソッドを呼び出す必要はありません。 –

答えて

12

メソッド自体ではなく、「もっと個性的なもの」抽象メソッドを作成する必要があります。

// AbstractBase.java 
public abstract class AbstractBase { 
    public final void method() { 
     everybodyDoesThisStuff(); 
     doIndividualStuff(); 
    } 

    abstract void doIndividualStuff(); 

    private void everybodyDoesThisStuff() { 
     // stuff that everybody does 
    } 
} 

// ConcreteClass.java 
public class ConcreteClass extends AbstractBase { 
    void doIndividualStuff() { 
     // do my individual stuff 
    } 
} 
+3

' everybodyDoesThisStuff() '実際に 'method'を呼び出すたびに' method'を 'final'にすることさえできます。 – aioobe

+0

@aioobeありがとう、ちょうどそれが追加されました! – forrert

+1

これは[テンプレートメソッドパターン](http://www.oodesign.com/template-method-pattern.html)と呼ばれます。 – Andreas

3

あなたは、通常の方法では、抽象メソッドを呼び出すことができます:

void foo(){ 
    // do stuff 
    bar(); // let the abstract method do the rest 
} 
abstract void bar(); 
5

一つの解決策は、super.method()を呼び出すために、すべてのサブクラスを必要とすることです。問題は実際にそれを強制する方法がないことです。別のオプションは、内部で必要な行を実行し、別の方法を作成することで、その後、抽象メソッドを呼び出します:doMethod()はそれができprotectedであるのに対し、

public final void method() { 
    callEveryTime(); 
    doMethod(); 
} 

protected abstract void doMethod(); 

method()ことはそう、それはどこにもなく、呼ば上書きすることができますpublic finalでは、オーバーライドされますが、パッケージ(またはサブクラス)の外では呼び出されません。

+0

これは[Template Method pattern](http://www.oodesign.com/template-method-pattern.html)と呼ばれています。 – Andreas

0

抽象メソッドを部分的に実装する必要があるかどうかを自分で確認するには、通常はデザインの細分性を再考する必要があります。

everybodyDoesThisStuffを別の方法で抽出してInterfaceに入れてみませんか?

+0

これも良い選択です。 –

+0

例を投稿できますか? – shmosel

関連する問題