inheritance另一个类的类是否inheritance了inheritance类/接口的类?

我有两节课:

public class Question : IDisposable, IEquatable { } public class SessionQuestion : Question, IDisposable, IEquatable { } 

由于Questioninheritance了IDisposableIEquatableIEquatable是否SessionQuestion隐式inheritance了这些接口?

答案是“是” – 接口是inheritance的。 但是,是否可以省略包含类中接口定义的内容取决于该类是否希望将某些接口成员作为显式接口实现 。

让我们来看看这个非常简单(而且很愚蠢)的例子:

 public interface IMyInterface { void foo(); } public class A : IMyInterface { public void foo() { Console.Out.WriteLine("A.foo() executed"); } } public class B : A, IMyInterface { void IMyInterface.foo() { Console.Out.WriteLine("B.foo() executed"); } } 

由于B希望将foo()方法作为显式接口实现 ,因此必须将IMyInterface接口指定为其类定义的一部分 – 即使类A已经实现了此接口。 在这种情况下,inheritance基类的接口声明是不够的。

如果B类没有显式的接口实现,那么B类不需要再次指定接口(在这个小例子中的IMyInterface )。

从基类inheritance接口并为该接口的成员提供一些显式接口实现可能会产生最多可能令人惊讶的效果,并且最坏的情况可能导致软件损坏/错误。

如果执行以下代码序列:

 A obj = new A(); obj.foo(); IMyInterface x = obj; x.foo(); 

输出将是

A.foo()执行了
A.foo()执行了

但是,让我们现在使用类型B的对象,否则保持代码完全相同:

 B obj = new B(); obj.foo(); IMyInterface x = obj; x.foo(); 

输出会有所不同:

A.foo()执行了
B.foo()执行了

为什么会这样? 请记住,B类inheritance了A类中foo()方法的实现。因此,调用obj.foo()仍然会执行inheritance的foo()方法。

那么,为什么x.foo()不会调用A类提供的foo()实现呢? 或者,为什么obj.foo()没有调用为B类中的foo()提供的实现?

因为xIMyInterface类型的变量,所以在调用x.foo()时,类型B的对象提供的foo()方法的显式接口实现优先。 变量obj 不是 obj.foo()类型,因此obj.foo()不会调用foo()方法的显式接口实现。

由于这些令人惊讶的结果,很容易理解为什么在大多数情况下,已经由基类实现的接口的显式接口实现确实是一个坏主意。 俗话说: 只因为你不能意味着你应该这样做

当然。

事实上,.NET Framework根本不是一个扁平的层次结构。 选择一个随机的课程并看一看。 你会看到它派生出一个派生类……的类,依此类推。

接口也被inheritance到大孩子,就像普通的类一样。

至于你必须实现的成员:如果你在Question实现它们,你当然不需要在SessionQuestion实现它们。

当然,您仍然需要实现接口定义的所有成员。 但是,如果基类包含与接口成员匹配的成员,则基类成员可以作为接口成员的实现,并且不需要再次手动实现它。