Ответ «Да» - интерфейсы наследуются. Однако, можете ли вы опустить, включая определения интерфейса из класса, зависит от того, хочет ли этот класс иметь определенные члены интерфейса как explicit interface implementations.
Если класс B не имеет явных реализаций интерфейса, то классу B не нужно будет указывать интерфейс (IMyInterface в этом маленьком примере) снова.
Наследование интерфейса из базового класса и наличие явной реализации интерфейса для членов этого интерфейса может привести к эффектам, которые могут быть в лучшем случае удивлены, а в худшем случае могут привести к поломке программного обеспечения.
Если выполнить следующую последовательность кода:
A obj = new A();
obj.foo();
IMyInterface x = obj;
x.foo();
выход будет
A.foo() выполняется
А.Foo() выполняется
Однако давайте теперь использовать объект типа B, но в остальном сохранить код в точности то же самое:
B obj = new B();
obj.foo();
IMyInterface x = obj;
x.foo();
выход будет несколько иным:
A.foo() выполнено
B.foo() выполнено
Почему это так? Помните, что класс B наследует реализацию метода foo() из класса A. Таким образом, вызов obj.foo()
по-прежнему будет выполнять унаследованный метод foo().
Теперь, почему тогда x.foo()
не вызывает foo() реализация, предоставляемая классом A? Или, почему obj.foo()
не вызывает реализацию, заданную для foo() в классе B?
Поскольку х является переменным типа IMyInterface, таким образом, явная реализацией интерфейса Foo() метода, представленного объектом типа B имеет преимущество при вызове x.foo()
. Переменная OBJ является не типа IMyInterface, следовательно, не будет obj.foo()
ссылаться на явную реализацию интерфейса метода Foo().
Из-за этих неожиданных результатов легко понять, почему явные реализации интерфейса для интерфейсов, которые уже реализованы базовым классом, в большинстве случаев являются плохой идеей. Как говорится: Просто потому, что вы можете это не значит, что вы должны.
Да, это так ... – Amit
Yup. Попробуйте сами: 'SessionQuestion s = new SessionQuestion();' then 'if (s is IDisposable)' – dman2306
Внимание: не то, чтобы вы путались. Из-за наследования * SessionQuestion * наследует 'IEquatable' from * Question *. Однако * SessionQuestion * также реализует 'IEquatable ', который представляет собой другой интерфейс, чем 'IEquatable '. Таким образом, вы можете опустить указание интерфейса * IDisposable * для * SessionQuestion * (он унаследован от * Question *), но вам нужно будет хранить 'IEquatable ' (так как этот интерфейс не реализован * Question *) –
elgonzo