どんな振る舞いをしたいですか?呼び出すたびIFoo.Bar()
に IBar の定義を使用します。これは単なるインターフェイスであり、個別の概念がまったくないためBar()
です。new
キーワードを使用してスーパークラスにキャストする場合にのみ、別のメソッドを呼び出すことができます。これは、インターフェイスを実装するのではなく、クラス内のメソッドをオーバーライドするときです。
インターフェイスが互いに継承する場合、サブインターフェイスにはメソッドの所有権の概念がほとんどありません。サブインターフェイスに両方のメソッドが宣言されているかのようです。
注意: 過剰な合併症と脳のメルトダウンの可能性!!! 注意して読んでください!!!
これは許可されていると思います。間違っている場合は修正してください。
public class IBar {
virtual void Bar() {
//IBar implementation of Bar
}
}
public class IFoo: IBar {
new virtual void Foo() {
//implementation of Foo when currently casted to IFoo
}
}
public class FooImpl: IFoo {
new void Foo() { /* implementation of Foo when cast to FooImpl */ }
new void Bar() { /* implementation of Bar when cast to FooImpl */ }
}
わかりやすくするためにクラス名の前に I を残しましたが、インターフェイスはもうありません。呼び出されるメソッドは、オブジェクトがキャストされたクラスによって異なります。
IBar b = new IBar();
b.Bar(); //calls IBar.Bar
IFoo f = new IFoo();
f.Bar(); //calls IFoo.Bar
f.Foo(); //calls IFoo.Foo
IBar fooAsBar = (IBar) f;
fooAsBar.Bar(); //calls IBar.Bar
FooImpl fi = new FooImpl();
fi.Bar(); //calls FooImpl.Bar
fi.Foo(); //calls FooImpl.Foo
IFoo fooImplAsFoo = (IFoo) fi;
fooImplAsFoo.Bar(); //calls IFoo.Bar
fooImplAsFoo.Foo(); //calls IFoo.Foo
IBar fooImplAsBar = (IBar) fi;
fooImplAsBar.Bar(); //calls IBar.Bar
ああ、ネストされたインターフェイスを使用していません。それらは互いに継承しているだけです。ネストされたインターフェースは次のようになります。
interface IBar {
void Bar();
interface IFoo {
void Foo();
}
}
ご覧のとおり、これはまったく異なります。2 つのインターフェイスの関係は、一方が他方の内部でのみ使用できるということだけです。それらは複雑でややトリッキーなトピックです。詳しくはこちらをご覧ください。:D