Jer*_*ers 12 .net c# mono interface
最近我发现C#允许
例如,IScreenCaliburn.Micro在http://caliburnmicro.codeplex.com/SourceControl/latest#src/Caliburn.Micro/IScreen.cs中执行此操作
namespace Caliburn.Micro
{
public interface IScreen : IHaveDisplayName, IActivate, IDeactivate,
IGuardClose, INotifyPropertyChangedEx
{
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这有用的原因,因为它意味着实现的类IScreen也需要实现其他接口.
但我想知道C#如何处理编译器和运行时明智.
这个问题的一些背景/背景:
我来自interface定义方法表的背景,实现接口的类既有自己的方法表,也有指向它们实现的接口的方法表的指针.
我脑子里浮现的各种问题源于我过去与人们进行过的各种多类继承讨论,其中我认为它们也适用于这种情况:
(我在这里使用了单词methods,暗示接口中定义的属性将具有get_或set_方法).
非常感谢对此的任何见解,以及如何更好地表达这个问题的提示.
首先,让我们明确地说"接口继承"与基于类的继承并不完全相同(并且使用"继承"这两个词可能会产生误导).
那是因为接口无法自己实例化,因此编译器/运行时对不必跟踪如何为独立接口类型进行虚拟调用(例如,您不需要知道如何调用IEnumerable.GetEnumerator- 您只需要知道如何在特定类型的对象上调用它.这允许在编译时以不同的方式处理事物.
现在我实际上并不知道编译器如何实现"接口继承",但是它是如何做到的:
让接口能够从多个基接口继承,该表中的方法顺序如何?
"派生"接口没有必要拥有一个方法表,该表包含来自其所有祖先接口的方法,因为它实际上并没有实现它们中的任何一个.每个接口类型只有一个自定义方法的表就足够了.
如果这些接口具有共同的祖先会怎样:这些方法会在表中多次出现吗?
鉴于上一个问题的答案,没有.最后IFoo,无论IFoo在实现的接口的"层次结构"中出现多少次,具体类型将仅实现一次.定义的方法IFoo只会出现在IFoo簿记表中.
如果这些接口具有不同的祖先,但类似的方法名称怎么办?
再说一遍,没问题.您需要适当的语法来告诉编译器"这里是如何实现的IFoo.Frob,这里是IBar.Frob",但由于方法IFoo和IBar将在不同的表中映射,因此没有技术问题.
当然,这留下了"运行时如何调度方法?"的问题.无人接听.但是想象一个可能的解决方案并不困难:每个具体类型C都指向它实现的每个接口的一个方法表.当进行虚拟方法调用时,运行时会查看具体类型,找到将要调用其方法的接口的表(接口的类型是静态已知的)并进行调用.