2010-05-25 120 views
1

鉴于方案继承类的方法...呼叫通过接口

interface IBase{ 
    void Process(int value); 
} 

abstract class Base : IBase 
{ 
public virtual void Process(int value){ throw new NotImplementedException(); } 
} 

class Implemented: Base, IBase 
{ 
public void Process(int value) 
{ 
    // .. some code here.. 
} 
} 

我想写类似如下的循环。

foreach(Base b in CollectionOfImplemented) 
{ 
b.Process(// something will go here //); 
} 

尝试此操作,它会一直调用Base.Process,而不是Implemented.Process;但集合中的类型是已实现的,而不是基本的。拳击它似乎工作,但我希望看看我是否能找到一个更聪明的方法,因为该集合将包含其他类型的对象,也继承了基地。

回答

9

您需要在Implemented明确覆盖Process

class Implemented: Base 
{ 
    public override void Process(int value) 
    { 
    // .. some code here.. 
    } 
} 

,否则将无法获得虚拟方法调度。另外,如果你的基础方法总是抛出NotImplementedException,那么它应该被标记为abstract,而不是。

+0

Visual Studio的一个优秀功能是在子类中,您可以开始输入单词“覆盖”,而智能感知系统会告诉您哪些虚拟方法可以被覆盖。 – Stephen 2010-05-25 17:31:29

0

我认为你需要在你的Implemented类中为Process指定“覆盖”。