6

この例では、Java Web サイトのチュートリアルページ. 2 つのインターフェイスが同じデフォルト メソッドを定義していますstartEngine()。クラスは両方のインターフェイスを実装し、明らかな競合のためにFlyingCarオーバーライドする必要があります。startEngine()

public interface OperateCar {
    // ...
    default public int startEngine(EncryptedKey key) {
        // Implementation
    }
}
public interface FlyCar {
    // ...
    default public int startEngine(EncryptedKey key) {
        // Implementation
    }
}

public class FlyingCar implements OperateCar, FlyCar {
    // ...
    public int startEngine(EncryptedKey key) {
        FlyCar.super.startEngine(key);
        OperateCar.super.startEngine(key);
    }
}

from がinとinterfacesの両方のバージョンを参照するために使用されるFlyingCar理由がわかりません。私が理解しているように、どのスーパークラスでも定義されていないため、常駐とは見なされません。また、 と で実装されている 2 つのインターフェイスの関係もわかりません。superstartEngine()OperateCarFlyCarstartEngine()superFlyingCar

4

2 に答える 2

7

複数のインターフェイスを実装するクラスがあり、それらのインターフェイスに同様のメソッド シグネチャを持つメソッドが含まれている場合 (たとえば、startEngine メソッドなど)。

どのメソッドを参照しているかを知るには、次のようにします。

yourInterface.super.method();

あなたの質問にも対処するこのリンクを見ることができます。

したがって、これを行うこともできます:

public class FlyingCar implements FlyCar, OperateCar{
    public int startEngine(EncryptedKey key) {
        return FlyCar.super.startEngine(key);
    }
}

またはこれ:

public class FlyingCar implements FlyCar, OperateCar{
    public int startEngine(EncryptedKey key) {
        return Operate.super.startEngine(key);
    }
}

どちらの方法でも、単純にインターフェイスからメソッドを呼び出す場合は、メソッドを呼び出すインターフェイスを指定する必要があります。

ただし、この特定の状況は、理由のある例です。起こりやすいのは、次のようなことをすることです。

public int startEngine(EncryptedKey key) {
    // Custom implemenation...
}

これも有効です。ただし、同じシグネチャを持つメソッドを持つ 2 つのインターフェイスがある場合は、そのメソッドを宣言する 1 つの親インターフェイスと、それを拡張する 2 つの子インターフェイスが必要な場合もあります。

public interface Car {
    // ...
    default public int startEngine(EncryptedKey key) {
        // Default implementation
};
}

public interface FlyCar extends Car {
    // Methods unique to FlyCar
}

public interface OperateCar extends Car {
    // methods unique to OperateCar
}
于 2015-10-18T07:05:32.890 に答える
5

私が理解しているように、 startEngine() はどのスーパークラスでも定義されていないため、常駐とは見なされません。

はい、定義されました。これはデフォルトの実装です。たとえば、次のようになります。

public interface OperateCar {
    // ...
    default public int startEngine(EncryptedKey key) {
        // Implementation
    }
}

OperateCar.super.startEngine(key)デフォルトの実装を実行します。

デフォルトの実装がなく、インターフェイス メソッドだけの場合、次のようにインターフェイスに実装が含まれないため、ステートメントは意味をなさないでしょう。

public interface OperateCar {
    // ...
    int startEngine(EncryptedKey key);
}

また、FlyingCar に実装されているように、スーパーと 2 つのインターフェイスの間に関係は見られません。

あなたが何を求めているのかよくわかりません。 super親インターフェースで実装を呼び出す方法です。がなければsuper、それを表現する他の方法はありません。

于 2015-10-18T07:04:34.267 に答える