何千ものクラスで実装されているインターフェイスXがあるシナリオがあります。次に、そのインターフェイスXに新しいメソッドを追加します。したがって、すべてのクラスのメソッドがオーバーライドされる問題を解決するために、最小限の方法で変更を加える方法
4 に答える
メソッドの実装がすべてのクラスに共通である場合は、おそらくan のabstract class
方が適しinterface
ています。
そうでない場合は、とにかくこれらのメソッドを作成します。
(*)最初はコメントでしたが、回答として入れるように要求されました。
- 新しいメソッドがそのインターフェイスのすべての実装で意味をなさない場合は、そこに追加しないでください。元のインターフェイスを拡張する新しいインターフェイスを作成してください。
- 千のクラスすべてにデフォルトの実装が必要な場合は、インターフェイスを抽象クラスに変更します
他の提案 (make itabstract
または) とは別にextend
、interface
さらに 1 つのオプションがあります。
インターフェイスのすべての実装者が基本クラスを拡張するようにします。このように、メソッドを に追加するときは、interface
デフォルトの動作を基本クラスに追加し、クラス固有の動作を (できれば) 少数の実装者に追加するだけで済みます。
すべてのクラスでこのメソッドの no-op 実装を使用してもかまわず、すべての実装クラスを制御できる場合は、すべてのクラスに移動せずに IntelliJ を使用して 3 つの手順で実行する非常にハックな方法を次に示します。
- メソッドをインターフェイスに追加する
メソッドを選択し、Refactor->Push Down... を呼び出します - メソッド宣言は、このインターフェイスを実装するすべてのクラスに表示されますが、少なくとも私のバージョンの IntelliJ IDEA (11.0.2) では実装がありません
void doSomething();
。この定義を選択し、プロジェクト全体の検索と置換を実行して、この文字列をデフォルトの実装に置き換えます。たとえば、@Override void doSomething() {}
メソッドをインターフェイスに再度追加します。