web-dev-qa-db-ja.com

Java抽象クラスでオプションのメソッドをオーバーライドする方法は?

基本クラスがあるとしましょう:

public abstract class BaseFragment extends Fragment {
    ...
    protected abstract boolean postExec();
    ...
}

そして、そこから派生して他のクラス(Fragment_Movie、Fragment_Weatherなど)を取得します。

public class Fragment_Music extends BaseFragment{
    @Override
    protected boolean postExec() {
        return false;
    } 
}

ただし、基本クラスに新しいメソッドを追加する場合:

public abstract class BaseFragment extends Fragment {
    ...
    protected abstract boolean postExec();
    protected abstract boolean parseFileUrls();
    ...
}

Eclipseは、すでに派生したクラスにこの新しいメソッドを実装するように求めるエラーを即座に表示します。

「デフォルト」の抽象メソッドを基本クラスに追加して、派生クラスに実装しなくてもエラーが表示されないようにすることはできますか? (基本クラスが新しいメソッドを追加するたびに、各派生クラスを修正するのに長い時間がかかるためです。)

19
markbse

最も簡単な解決策は、スタブ化された実装でメソッドを追加することです。抽象宣言必須メソッドを実装するための非抽象拡張。

このようなことを行うと、コンパイルの問題が緩和されますが、オーバーライドせずに使用すると明らかに例外がスローされます。

public abstract class BaseFragment extends Fragment {
    protected boolean doSomethingNew() {
        throw new NotImplementedException("method not overridden");
    }
}
35
akaIDIOT

抽象クラス(インターフェースを含む)のみが、その基本クラスからすべてのメソッドを宣言することは想定されていません。

したがって、たとえば、1つの基本クラスを拡張するインターフェースまたは1つのインターフェースを暗黙指定する抽象クラスは、すべてのメソッドを宣言する必要はありません。非実装メソッドの実装は、最初のより深い具象サブクラスの仕事です。

したがって、問題については、最終的に、コラボレーター(新しい共通メソッドを含む)を基本クラスの保護フィールドとして追加して、継承よりも構成を使用できます。

したがって、具象クラスに何も実装する必要はなく、これらのクラスが適切なサブクラスメソッド内でコラボレーターのメソッドを使用できるようにする必要はありません。

目的がBridge patternに興味があるかもしれません(ウィキペディアから):

ブリッジパターンはソフトウェアエンジニアリングで使用される設計パターンであり、「2つを独立して変更できるように、抽象化を実装から切り離す」ことを意図しています。

2
Mik378

抽象メソッドの目的は、forceを実装することです。

スーパークラスに抽象メソッドを追加する場合は、コードをリファクタリングして実装を提供する必要があります。あなたのプログラムはデフォルトの実装でも一貫していません-カスタム型を返す必要がある場合はどうでしょうか?適切な実装を提供するために時間をかけます。追加した場合、おそらくそのようなメソッドを呼び出す必要があるからです。

0
moonwave99

基本クラスから新しい抽象メソッドを使用して、新しい抽象クラスを派生させることができます。この新しいクラスからの新しいメソッドと古い基本クラスからのメソッドを持つべき具象クラスを派生させます。

0
jpstrube