代码之家  ›  专栏  ›  技术社区  ›  Naser Asadi

C#接口实现解析

c#
  •  0
  • Naser Asadi  · 技术社区  · 2 年前

    我对C#中关于接口实现解析的以下场景感到困惑。以下代码编译时没有任何错误:

    interface IA
    {
        void Method();
    }
    
    class CustomAttribute : Attribute { }
    
    interface IB : IA
    {
        [Custom]
        new void Method();
    }
    
    class BaseA : IA
    {
        public void Method() => Console.WriteLine("Implementation in base");
    }
    
    class B: BaseA, IB
    {
        new public void Method() => Console.WriteLine("Implementation in B");
    }
    
    class C : BaseA, IB
    { 
    }
    

    接口 IA 位于我们无法访问的类库中 IB 我们正在向该方法添加一个自定义属性。我早料到 Class C 需要另一个实现 Method 除了一个 BaseA .

    我的问题是,为什么 class C 这个 new Method 实施 IB 是从 BaseA 当它被标记时 new 在里面 IB ?

    在C#规范中,哪里指定了在这种情况下如何解决实现问题?

    这个解析过程有名字吗?

    1 回复  |  直到 2 年前
        1
  •  3
  •   Sweeper    2 年前

    这个解析过程有名字吗?

    那是 interface mapping .

    在接口映射过程中,编译器总是检查基类是否有该接口成员的实现。

    (强调我)

    类或结构C的接口映射为基类列表中指定的每个接口的每个成员定位实现 C 特定接口成员的实现 I.M ,在哪里 I 是成员所在的界面 M 声明,通过检查每个类或结构体来确定 S , 开始于 C 并对每个连续的基类重复 C ,直到找到匹配。。。

    • 如果 S 包含匹配的显式接口成员实现的声明 一、 M ,则此成员是 实施 I.M .

    • 否则, 如果 S 包含符合以下条件的非静态公共成员的声明 M ,那么这个成员就是实现 I.M . [...]

    对于像这样的常规公共方法 BaseA.Method ,没有什么可以阻止它被映射到 二者都 IA.Method IB.Method .

    然而,如果 BaseA。方法 是一个显式的接口实现:

    class BaseA : IA
    {
        void IA.Method() => Console.WriteLine("Implementation in base");
    }
    

    然后,它只能映射到 IA.方法 ,以及 class C: BaseA, IB {} 将发出编译器错误。