Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与基类和派生类接口以实现多重继承_C# - Fatal编程技术网

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

C# 与基类和派生类接口以实现多重继承,c#,C#,我得到了下面的代码,我想知道这些类和接口之间的关系 多重继承不适用于C#,但我们可以使用接口实现吗 请告诉我下列代码是否正确?为什么会这样? 我很困惑? 请帮我摆脱困境 public interface MyInterface { void Method(); } public class Base { public void Method() { } } public class Derived : Base, MyInterface { } 请告诉我下列代码是

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

多重继承不适用于C#,但我们可以使用接口实现吗

请告诉我下列代码是否正确?为什么会这样? 我很困惑? 请帮我摆脱困境

public interface MyInterface 
{ 
    void Method(); 
}

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

public class Derived : Base, MyInterface { }
请告诉我下列代码是否正确

是的,它会的,但你可以通过尝试自己发现这一点

为什么会这样

非常简单,
Derived
实现了
MyInterface
所需的契约。它碰巧是通过
Base
实现的,它不知道接口,但它仍然拥有所有相关的成员

然而,这里有一个危险——事实上,接口不仅仅是让适当的成员可供调用方使用;它们是关于这些成员的语义。只有当
Base.Method()
的语义恰好符合
MyInterface.Method()
的要求时(而不是通过显式的、声明的设计),这样的类层次结构才起作用。即使一开始是有效的,
Base
的维护者可能会决定更改
Method
的行为,该行为根据
Base.Method
的保证是有效的,但根据接口的保证是无效的

编辑:关于语言规范,参见C#4规范第13.4.4节:

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

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

[……]

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


谢谢我已经编译并检查了它,但我只想知道这些派生类如何与接口一起工作。@VigneshLakshmanan:如果您已经编译了它,为什么要明确询问它是否已编译?如果你说:“这段代码可以编译,但我不明白为什么”,那将是一个更明智的问题。对此我很抱歉!!!!!!!!我怀疑它为什么会被编译,我也不确定它为什么会被编译?这就是为什么我会问这样一个问题:它会编译吗?我很惊讶代码已经编译了。void Method()未在派生类中实现。@VigneshLakshmanan:我的观点是,这可能就是为什么你的问题有3张反对票,以防万一你想知道。。。