【发布时间】:2013-11-14 10:09:06
【问题描述】:
最近我发现 C# 允许
例如,Caliburn.Micro 中的 IScreen 在 http://caliburnmicro.codeplex.com/SourceControl/latest#src/Caliburn.Micro/IScreen.cs 中执行此操作
namespace Caliburn.Micro
{
public interface IScreen : IHaveDisplayName, IActivate, IDeactivate,
IGuardClose, INotifyPropertyChangedEx
{
}
}
我明白为什么这是有用的,因为这意味着实现 IScreen 的类也需要实现其他接口。
但我想知道 C# 如何处理该编译器和运行时。
这个问题的一点背景/上下文:
我的背景是接口定义了一个方法表,实现接口的类既有自己的方法表,也有指向它们实现的接口的方法表的指针。
我脑海中盘旋的子问题源于我过去与人们进行的各种多类继承讨论,我认为它们也适用于这个案例:
- 如果一个接口能够从多个基接口继承,那么该表中方法的顺序是怎样的?
- 如果这些接口有共同的祖先会怎样:这些方法会在表中出现多次吗?
- 如果这些接口有不同的祖先,但方法名称相似怎么办?
(这里我用的是methods这个词,暗示接口中定义的属性会有get_或set_方法)。
非常感谢任何对此的见解,以及如何更好地表达这个问题的提示。
【问题讨论】:
-
您的问题是关于在运行时在 CLR 中是如何表示的?或者编译器是如何执行的?
-
你所有的项目符号只适用于一个具体的类,一个接口不继承任何实现,没有表也没有方法。接口方法到实现它的具体方法的映射是在运行时动态完成的,并且在调用该方法之前不会发生。下面的管道非常坚固,是 CLR 中使用汇编代码的少数几个地方之一。
-
@HansPassant:这些对你提供的深层内部结构的短暂一瞥令人抓狂! :-) 您能否提供相关 CLR 资源的链接?你从哪里得到这些信息?如果是原创研究,你会在任何地方发布结果吗?谢谢!
-
@HansPassant +1;谢谢你。我最初来自本机端的一部分,其中接口确实具有方法表以便具有 COM 兼容性。