5

私はJavaで次の階層を持っています:

interface ObserverA {}

interface A {
  void method1();
  addObserver(Observer o);
}

そして、私はそれを次のように拡張したいと思います:

interface ObserverB extends ObserverA{}

interface B extends A {
   void method2();
   addObserver(ObserverB  o);
}

addObserver()メソッドがBの同じメソッドをオーバーライドするような方法でA。そのままでは機能しないため、 の実装では のB両方のバージョンを実装する必要がありますaddObserver()。1 つだけにしたくありません。

Aこれは、次のようにパラメータ化する必要のない巧妙な方法で行うことができますか?

interface A<O extends Observer> { 
    addObserver(O o);
}

ハックなソリューションは大歓迎です!

4

3 に答える 3

2

あなたの例は何か違うことを示していますが、異なるクラスによって実装された汎用インターフェイスを実現したいと思います。これを見てください:

public interface Observer<T> {
    void addObserver(T t);
}

public class First implements Observer<First> {
    @Override
    public void addObserver(First t) {
    }
}

public class Second implements Observer<Second> {
    @Override
    public void addObserver(Second t) {
    }
}

ご覧のとおり、First と Second の両方のクラスが同じインターフェイスを実装していますが、パラメーターの型が異なります。それらは実装されたインターフェースを自分自身でパラメーター化しますが、書く代わりに、Observer<Frist>あなたが書きObserver<Integer>たいものを書くことができます。

編集

あなたの明確化を考慮に入れると、これはあなたが提示したインターフェース階層内のコードの一般的な実装になります。

interface ObserverA {}

interface A<T> {
    void method1();
    void addObserver(T o);
}

interface ObserverB extends ObserverA {}

interface B extends A<ObserverB> {
    void method2();
}
于 2013-03-29T09:39:38.927 に答える
1

どうですか -

interface ObserverA {}

interface A {

    <T extends ObserverA> void addObserver(T o);
}

と -

interface ObserverB extends ObserverA{}

interface B extends A{

    // do nothing, or omit this interface entirely.

}

ObserverA継承する任意の型を引数としてメソッドに渡すことができるようにしますaddObserver

少し説明が必要な場合は、読み進めてください。

Bounded Type Parameterを使用するように、最初のインターフェイスのメソッドを変更しました。addObserver宣言されている方法では、型がである限りObserverA、または から継承する限り、任意のオブジェクトを引数としてメソッドに渡すことができますObserverA。yourObserverBは から継承しているため、とタイプObserverAの両方のオブジェクトを引数としてこのメ​​ソッドに安全に渡すことができます。ObserverAObserverB

編集

あなたの説明から、2 つの異なるインターフェイスを階層関係なしで作成する必要があるようです。最初のメソッドを避けながら、2 番目のメソッドのみの実装を提供する必要があるため、それらは無関係に見えます。したがって、最初のインターフェースからメソッドの実装を強制的に提供するのではなく、それらを分離する必要があります。これには OOP 原則もあります - Interface Segregation Principle

于 2013-03-29T09:15:05.847 に答える