21

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

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

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

4

5 に答える 5

43

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

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

public abstract class BaseFragment extends Fragment {
    protected boolean doSomethingNew() {
        throw new NotImplementedException("method not overridden");
    }
}
于 2012-09-27T11:34:51.187 に答える
0

抽象メソッドの目的は、それらの実装を強制することです。

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

于 2012-09-27T11:35:12.387 に答える
-1

public BaseFragment クラスを抽象化する

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

    }
于 2012-09-27T11:32:24.683 に答える