1

編集:私の質問に対する簡単な答えは、Java では 1 つのインターフェイスが他の複数のインターフェイスを拡張できるということです。これは、共通のインターフェイスでインターフェイスをグループ化する方法についての私の論理的な質問に答えるものです. この回答は、だまされた質問には表示されませんでした。また、質問は異なり、インターフェイス グループの作成に関するものではありませんでした。

Javaで、あるインターフェースを他のインターフェースを実装するものとして定義できない理由はありますか? 私が見て不満を抱いている答えは、「インターフェース自体には実装が含まれていないのに、インターフェースが他のインターフェースをどのように実装できるのでしょうか?」というものです。私の意見では、それは弱い答えです。なぜなら、それはシナリオの論理的な解釈というよりも、英語のセマンティクスに賛成だからです。このシナリオの論理的な解釈は、多くのインターフェイスを実装するクラスを定義できるため、それ自体がインターフェイスのコレクションを表すインターフェイスを定義できない理由です。

多くのインターフェイスからなる大規模な共通セットをそれぞれ実装するクラスが多数あるとします。現状では、各クラスのリストを明示的に書き出す必要があります。これは、後で別のインターフェイスを多数のリストに追加する必要がある場合、各クラスを変更する必要があることを意味します。すべてのインターフェースを 1 つの「スーパー インターフェース」に統合すると、プログラマは 1 か所だけで変更を加えることができます。

そして、「インターフェースのリストを実装する抽象スーパークラスを作成し、すべてのサブクラスでそのスーパークラスを拡張する」と答える前に、これらのクラスがまだクラスを拡張していないと仮定できないことに注意してください。implements キーワードの全体的な利点の 1 つは、分類法を変更せずにクラスを適応させることができることですよね?

簡単に言えば、プログラマーは、他のインターフェイスの単なるグループであるインターフェイスを定義できないのはなぜですか? または、より良い質問は次のとおりです。他のインターフェイスを実装するインターフェイスを定義できない場合、他のインターフェイスのグループであるインターフェイスをどのように定義できますか?

コードを好む人のために、私が尋ねているのは、これを行う代わりに...

public class Foo extends ParentClass1 implements IBar1, IBar2, IBar3{
}

public class Baz extends ParentClass2 implements IBar1, IBar2, IBar3{
}

...Javaがこれを許可する方が理にかなっているでしょうか:

public interface IAllBar implements IBar1, IBar2, IBar3{
}

public class Foo extends ParentClass1 implements IAllBar{
}

public class Baz extends ParentClass2 implements IAllBar{
}

そうすれば、後で IBar4 を作成する場合、Foo.java と Baz.java の代わりに IAllBar.java を変更するだけで済みます。

編集:したがって、以下の回答に従って、 IAllBar を定義してこれらすべてのインターフェイスを拡張することができ、必要なものを正確に取得できます。下にジャンプして意地悪な回答を投稿する前に、投稿全体を進んで読んでくれる人がいるのはうれしいです。

4

3 に答える 3

1

他のインターフェイスのコレクションであるインターフェイスを定義できます。インターフェイスの拡張と呼ばれます。複数のインターフェイスを拡張できます。

インターフェースでメソッドを定義できない理由は、Java インターフェースの定義方法にあります。そして、あなたが話している問題は、単一継承の結果です。

ただし、新しいJava 8には、あなたが話している大規模なコードベースの問題に対処する仮想拡張メソッドと呼ばれる機能があることを知って喜ぶでしょう.

個人的には、迅速なリファクタリングのためにレガシー コード ベースで役立つと思いますが、システムが適切に設計されていれば、後でデフォルトの実装を取り除くことができるはずです。また、この機能を使いすぎると、多重継承のすべての欠点が生じるだけです。

于 2013-06-26T04:58:10.917 に答える
0

私の理解によると、あなたの問題文は次のとおりです。

クラスのグループが同じインターフェイスのセットを実装し、インターフェイスによって公開される多くの動作が共通の実装を持つタイプ階層を設計する方法。

この種の設計上の問題は、次の方法で Java で解決できます (コード例で説明します)。

public abstract class AbstractAllBar implements IBar1, IBar2, IBar3{

/* Provide implementations of methods whose behavior remains unchanges for all of it's children classes.*/

}

この抽象クラスは、抽象クラスAbstractAllBarで定義された共通の動作セットを持つクラスによって拡張できます。

public class ParentClass1 extends AbstractAllBar {

.......    

}

public class ParentClass2 extends AbstractAllBar {

.......    

}

public class Foo extends ParentClass1 {

}

public class Baz extends ParentClass2 {

}

この種の抽象クラスは、スケルトン実装を提供します。スケルトン実装の例はCollection APIにあります。より明確にするために、 AbstractListAbstractSetのソース コードを参照できます。

于 2013-06-26T05:22:36.917 に答える