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
的引用赋值给AbstractFunctionality
和IFunctionality
types的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多态。 介绍virtual
和override
使运行时环境在子类中执行overriden方法。
您缺lessvirtual
和override
关键字。 没有这个,你不会得到虚拟function。
您可以将AbstractFunctionality中的Method
标记为virtual
并将ConreteFunctionality
的Method
标记为override
。 正如mihirj所示。
解决了类似的问题 – 为什么C#接口方法没有被声明为抽象的或虚拟的?