CSharp - C# 接口继承到抽象类

假设我的接口如下所示:


public interface IFunctionality
{ void Method(); }

我实现了一个抽象类,它是一个抽象类,如下所示:


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 的引用分配给变量 AbstractFunctionalityIFunctionality

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

时间:

这里:


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

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

现在,如果重新实现该接口:


public class ConcreteFunctionality : AbstractFunctionality, IFunctionality

。 然后接口映射将引用 ConcreteFunctionality 中的方法,你将通过接口 ( i 。 在为你的第二个AbstractFunctionality call,你第三个电话的原理),但你还是得到了实现

AbstractFunctionality virtual中创建方法,并在 ConcreteFunctionality 中重写它通常会更加简洁和更加健全。 这种方法在所有情况下都会使用 ConcreteFunctionality 实现。

你需要将类定义为:


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

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

由于你没有在 Method() 中覆盖conretefunctionality,所以运行时环境在这里执行 Method() 与AbstractFunctionality object相关,因为它在这里不能应用动态多态。 引入 virtualoverride 使运行时环境在子类中执行重写方法。

你缺少 virtualoverride 关键字。 没有这个你就得不到虚函数。

你可以标记在AbstractFunctionality Methodvirtual 和马克的MethodConreteFunctionalityoverride 。 如mihirj所示。

- 中处理的类似问题- 为什么C#接口方法未声明为抽象或者虚拟

...