gpt4 book ai didi

c# - 为什么接口(interface)成员没有映射到派生类的非静态方法

转载 作者:太空宇宙 更新时间:2023-11-03 12:24:15 24 4
gpt4 key购买 nike

我写了一个接口(interface)和一个实现它的基类A,然后是一个派生类B:

interface ITest
{
void fn();
}

class A: ITest
{

void ITest.fn()
{
Console.WriteLine("fn in A");
}
}

class B: A
{

public void fn()
{
Console.WriteLine("fn in B");
}

}

class Program
{
static void Main(string[] args)
{
ITest tan = new B();
tan.fn();
Console.Read();
}
}

结果显示调用了A中的fn。但是根据interface mapping rules ,我很疑惑:

  1. If S contains a declaration of an explicit interface member implementation that matches I and M, then this member is the implementation of I.M.

  2. Otherwise, if S contains a declaration of a non-static public member that matches M, then this member is the implementation of I.M.

对于B的一个实例,它不符合规则1,没有明确的接口(interface)成员实现。但是,它有自己的非静态公共(public)成员 fn,我认为这符合规则 2。所以 tan.fn() 应该调用方法 fn B,则无需在其基类 A 中寻找另一个 fn

怎么了?

(解决这个问题将帮助我理解接口(interface)重新实现)

最佳答案

因为是显式接口(interface)实现。隐式实现接口(interface)使方法在 B 中也可见。

此外,为了能够在 B 中覆盖它,您需要将其设为虚拟。

规则 2 不适用于 B,因为规则 1 适用。有一个显式接口(interface)实现,即继承自 A 的接口(interface)实现。

按如下方式更改您的代码:

class A : ITest
{
public virtual void fn()
{
Console.WriteLine("fn in A");
}
}

class B : A
{
public override void fn()
{
Console.WriteLine("fn in B");
}
}

或者,如果您确实想显式实现该接口(interface),您可以让该实现调用一个您可以在 B 中重写的 protected 虚方法。

class A : ITest
{
void ITest.fn()
{
FnCore();
}

protected virtual void FnCore()
{
Console.WriteLine("fn in A");
}
}

class B : A
{
public override void FnCore()
{
Console.WriteLine("fn in B");
}
}

正如 Sergey.quixoticaxis.Ivanov 指出的那样,您还可以通过如下更改 B 的声明来重新实现接口(interface):

class B : A, ITest

但是,这有一个很大的缺点:该方法不像您通常期望的那样是多态的。事实上,这段代码会给你预期的结果:

static void Main(string[] args)
{
ITest tan = new B();
tan.fn();
}

鉴于您的接口(interface)是在 A 中显式实现的,下面的代码无法编译。但是如果它是隐式实现的,当 B 只是重新实现接口(interface)而没有覆盖虚基方法时,下面的代码仍然会输出“fn in A”:

static void Main(string[] args)
{
A tan = new B();
tan.fn();
}

关于c# - 为什么接口(interface)成员没有映射到派生类的非静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45879080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com