接口与基类和派生类实现多重继承

时间:2012-03-22 06:43:39

标签: c#

我得到了以下代码,我想知道这些类和接口之间的关系。

多重继承不能与C#一起使用,但是我们可以使用接口实现吗?

请告诉我以下代码是否会编译?为什么会这样? 我很迷茫? 请帮帮我........

public interface MyInterface 
{ 
    void Method(); 
}

public class Base 
{
     public void Method() { }
}

public class Derived : Base, MyInterface { }

1 个答案:

答案 0 :(得分:4)

  

请告诉我以下代码是否会编译?

是的,它会 - 但你可以通过尝试来找到它。

  

为什么会这样?

很简单,Derived实现了MyInterface所需的合同。碰巧是通过不知道接口的Base来做到这一点,但它仍然拥有所有相关成员。

但这里存在危险 - 实际上,接口不仅仅是为呼叫者提供合适的成员;它们与这些成员的语义有关。像这样的类层次结构仅在Base.Method()的语义完全匹配MyInterface.Method() 的重合的要求时才有效(与显式的声明设计相反)。即使从一开始就有效,Base的维护者可能会决定根据Method保证的内容对Base.Method的行为进行更改,但 isn 't 根据接口的保证有效。

编辑:就语言规范而言,这是在C#4规范的第13.4.4节中:

  

类或结构必须提供类或结构的基类列表中列出的所有接口成员的实现。在实现类或结构中定位接口成员的实现的过程称为接口映射。

     

类或结构C的接口映射为C的基类列表中指定的每个接口的每个成员定位一个实现。特定接口成员IM的实现,其中I是声明成员M的接口,通过检查每个类或结构S来确定,从C开始并重复每个连续的C类基类,直到找到匹配为止。

     

[...]

     

如果无法为C的基类列表中指定的所有接口的所有成员定位实现,则会发生编译时错误。

相关问题