インターフェイスAに100個のメソッドがあり、インターフェイスAの10個のメソッドのみを実装したい場合、しかし、条件は抽象クラスを使用できないことです親切に解決策を手伝ってください
6 に答える
インターフェイス A に 100 個のメソッドがあり、インターフェイス A の 10 個のメソッドのみを実装したい場合
それはインターフェースがどのように機能するかではありません。それらは契約です。インターフェイスのすべてのメソッドは と の両方abstract
でpublic
あるため、それぞれの実装を提供する必要があります。
ここで、100 個のメソッドを持つ抽象基本クラスを使用している場合、そのうちの 90 個にデフォルトの実装を与え、残りの 10 個を純粋に にすることができますabstract
。
そして最後の注意点として。1 つのインターフェイスに 100 個のメソッドがあるというのは、ちょっと壮大すぎます。その男をもっと小さな断片にハッキングすることを検討してください:p
解決策がありません。
Interface
class 以外の実装クラスはすべてのインターフェイス メソッドを実装するabstract
必要があるように設計されています。override
2 つの選択肢:
- インターフェイスを実装する別のクラスを拡張します。そして、実装したいメソッドだけを単純にオーバーライドします。
- 他のクラスを拡張しないでください。10 個のメソッドを完全に実装し、他のメソッドには空のボディ実装を提供します。
このインターフェイスを複数の小さなインターフェイスに分割するのは良い考えかもしれません。現在の大きなインターフェイスは、この大きなインターフェイスが本当に必要な場合は、これらすべての小さなインターフェイスを簡単に拡張できます。いずれにせよ、100 個のメソッドを持つことはおそらく多すぎます。それを実装するクラスの結束は非常に低いと思います。
クラスが 100 個のアクションのうち 10 個のアクションしか実行できない場合、そのクラスは実際にはコントラクトを尊重していません。銀行契約について考えてみましょう。10 万ドルを受け取るための書類に署名したのに、1 万ドルしかもらえなかったらどうしますか? 正しくない/正しくないようですね。でも、10k の書類にサインして、約束通り 10k を手に入れたら、満足ですよね?
別の解決策はアダプターです。http://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseAdapter.htmlをご覧ください。このクラスはすべてのマウス リスナー (空のメソッド) を実装します。1 つ、2 つ、または 2 つだけオーバーライドする必要がある場合は、このクラスを拡張して必要なものを実装するだけですが、大きなインターフェイスではなく、3 つの小さなインターフェイスがあります。すべてを行うこと。
また、Java 8 以降、インターフェースのメソッドはデフォルトの実装を持つことができるため、空のメソッド実装をインターフェースで直接提供できます。
100 個のメソッド インターフェイスを小さな意味のあるインターフェイスX[]に分割し、使用する 10 個のメソッドを単一のインターフェイスAに配置します。
これで、クラスCは必要なものであるAだけを実装できます。
100 個のインターフェイスすべてを実装するクラスZで。あなたは2つの解決策を持っています
- X[]のすべてのインターフェイスを単一のインターフェイスBで拡張し、 Zで実装します
- ZですべてのX[]インターフェイスを 実装する
結論: インターフェースを再構築し、それらをより小さなインターフェースに分割する必要があります。100 メソッド インターフェイスは保守が難しく、設計が悪いことを示しています。
このようなものを提供できます
Iterator i = new Iterator() {
int[] a = {1,2,3};
int i = 0;
@Override
public boolean hasNext() {
return i < a.length;
}
@Override
public Object next() {
return a[i++];
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not implemented");
}
};