C#接口inheritance到Abstract类

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

public interface IFunctionality { void Method(); } 

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

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

再次我有一个具体的类inheritance抽象类如下:

 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的引用赋值给AbstractFunctionalityIFunctionalitytypes的variables。

内部发生了什么事 请澄清。

这里:

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

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

现在如果你重新实现接口:

 public class ConcreteFunctionality : AbstractFunctionality, IFunctionality 

…接口映射将引用ConcreteFunctionality的方法,您将获得您期望通过接口调用的行为(即第三个调用),但您仍然可以在AbstractFunctionality获得第二个调用的实现。

AbstractFunctionality虚拟中使用该方法通常会更清洁,更保持健全,并在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"); } } 

由于您在ConreteFunctionality中没有重写Method(),所以运行时环境执行与AbstractFunctionality对象关联的Method(),因为它在这里不能应用dynamic多态。 介绍virtualoverride使运行时环境在子类中执行overriden方法。

您缺lessvirtualoverride关键字。 没有这个,你不会得到虚拟function。

您可以将AbstractFunctionality中的Method标记为virtual并将ConreteFunctionalityMethod标记为override 。 正如mihirj所示。

解决了类似的问题 – 为什么C#接口方法没有被声明为抽象的或虚拟的?

Interesting Posts