gpt4 book ai didi

C#接口(interface)继承到抽象类

转载 作者:IT王子 更新时间:2023-10-29 03:49:48 25 4
gpt4 key购买 nike

假设我有一个定义如下的接口(interface):

public interface IFunctionality
{
void Method();
}

我为一个抽象类实现了这个接口(interface),如下所示:

public abstract class AbstractFunctionality: IFunctionality
{
public void Method()
{
Console.WriteLine("Abstract stuff" + "\n");
}
}

我还有一个继承自抽象类的具体类,如下所示:

public class ConcreteFunctionality: AbstractFunctionality
{
public void Method()
{
Console.WriteLine("Concrete stuff" + "\n");
}
}

现在我有以下代码,

ConcreteFunctionality mostDerived = new ConcreteFunctionality();
AbstractFunctionality baseInst = mostDerived;
IFunctionality interfaceInst = mostDerived;
mostDerived.Method();
baseInst.Method();
interfaceInst.Method();

执行这些东西后我得到的输出如下。

Concrete stuff
Abstract stuff
Abstract stuff

但是我一直期望在所有三种情况下输出都是“具体的东西”,因为我在这里所做的是将 ConcreteFunctionality 的引用分配给 AbstractFunctionality 类型的变量IFunctionality

内部发生的事情。请澄清。

最佳答案

这里:

public class ConreteFunctionality:AbstractFunctionality
{
public void Method()
{
Console.WriteLine("Concrete stuff" + "\n");
}
}

...您没有覆盖现有 方法。您正在创建一个 方法,它隐藏 现有方法。 (你也应该得到一个警告,如果你真的想要这种行为,建议使用 new 修饰符。)接口(interface)是在 AbstractFunctionality 中实现的,所以接口(interface)映射表引用该类中的方法。

现在,如果您重新实现接口(interface):

public class ConcreteFunctionality : AbstractFunctionality, IFunctionality

...然后接口(interface)映射将引用 ConcreteFunctionality 中的方法,您将通过接口(interface)(即您的第三个调用),但您仍会在 AbstractFunctionality 中获得第二次调用的实现。

AbstractFunctionality 中的方法设为虚拟的,并在 ConcreteFunctionality 中覆盖它通常会更干净、更健全。这样它将在所有情况下都使用 ConcreteFunctionality 实现。

关于C#接口(interface)继承到抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14516955/

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