C#hack:接口和抽象类之间的低级别差异

Ily*_*huk 8 c# oop inheritance interface

这是一个关于C#基础知识的哲学问题:我想知道完全抽象类可以模拟接口的接近程度.假设我们有以下界面:

public interface INativeInterface
{
    void PerformAction();
    String Property { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以下是抽象类:

public abstract class ISimulatedInterface
{
    public abstract void PerformAction();
    public abstract String Property { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

他们有很多共同点,不是吗?我所知道的差异是:

  • 多重继承不适用于抽象类
  • 显式实现不适用于抽象类

使用反射或类似的东西可以跳过这些限制吗?

我意识到接口和抽象类在root中是不同的:接口声明了" 可以表现得像 " 的条件,抽象类 - " 是一种 ",但即使这似乎是如此接近以至于这些实体之间的低级别差异要讨论的.这个问题甚至可以听起来像"你会用C++创建一个接口".

Ond*_*cny 4

可以通过使用反射或类似的东西来跳过这些限制吗?

不。抽象类和接口在公共语言运行时级别是不同的概念。因此,这在 C# 中是不可能的,因为最终受到 CLR 边界的限制。

我想知道完全抽象类可以多么接近地模拟接口。

这是可行的,但需要底层执行环境(无论是物理的还是托管的)的支持(或“允许”)。

过去我设计了一种完全用抽象类代替接口的语言。是的,它确实支持此类“接口”的多重继承。然而,实施的特殊性可能不值得付出努力。主要的“低级差异”是继承的抽象类的内部嵌入实例必须保留在实现类的实例中,并且this必须维护指针链。不用说,这是一次愉快的经历:-)

  • 请注意,接口功能的一些限制实际上是 C# 的限制,而不是 CLI 的限制。例如,[接口可以包含 CIL 中的静态字段和方法](https://gist.github.com/mormegil-cz/8225412),但不能包含 C# 中的静态字段和方法。 (3认同)
  • @JeppeStigNielsen 所有成员均应公开。不允许使用实例成员。参考号 §I8.9.4,http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf (2认同)