2010-05-25 103 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指定「覆蓋」。