Что бы вы хотели, чтобы поведение было? Всякий раз, когда вы вызываете 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();
}
}
Как видите, это совсем другое. Связь между двумя интерфейсами только в том, что один может использоваться только внутри другого. Это сложная и несколько сложная тема. Вы можете узнать больше здесь . : D