2011-03-17 14 views
4

我有如下類結構基類的靜態成員的單獨的副本:具有每個派生

public abstract class PresenterBase 
{ 
    public static Dictionary<string, MethodInfo> methodsList; 

    public void Bind() 
    public void Initialize(); 
} 


public class DevicePresenter: PresenterBase 
{ 
    public void ShowScreen(); 
    public void HandleEvents();  
} 

public class HomePresenter: PresenterBase 
{ 
    public void ShowScreen(); 
    public void HandleEvents(); 
} 

我想有HomePresenter和DevicePresenter具有在PresenterBase定義methodsList靜態成員的單獨的副本。

不幸的是,他們與上述實施共享相同的副本。

他們是否是替代方法,我可以爲HomePresenter和DevicePresenter分別提供methodsList的副本? 我不願意在派生類中定義methodsList,因爲將來如果有人添加另一個派生類,他將不得不記住將methodsList添加到該類。

回答

6

不要讓它變成靜態的。這不行嗎?

static意味着與類型相關;非static意味着與實例關聯。

我沒有Visual Studio實例方便,但我相信你也可以在基類中標記字段abstract;那麼編譯器會要求你將它添加到任何派生類中。你肯定可以做到這一點與財產。

另一方面,考慮到上面的代碼,我可能會添加抽象方法ShowScreen()HandleEvents()PresenterBase

1

我不會讓靜態的,只要你想每個實例有它自己的列表中,定義methodsList作爲PresenterBase的性質和定義PresenterBase一個構造函數,採取Dictionary<string, MethodInfo>並設置歡迎使用屬性爲這個值

這樣你確保任何派生類必須提供這個,但每個實例都有自己的列表。

我還要定義抽象方法ShowScreen()HandleEvents()PresenterBase作爲@邁克爾Kjorling表明

3

要直接回答這個問題,你可以使基類通用的,這會給你單獨的靜態辭典,如果這是一個好的設計或不是另一個問題。

public abstract class PresenterBase<T> where T : PresenterBase<T> 
{ 
    public static Dictionary<string, MethodInfo> methodsList = 
     new Dictionary<string,MethodInfo>(); 

} 

public class DevicePresenter : PresenterBase<DevicePresenter> 
{ 

} 

public class HomePresenter : PresenterBase<HomePresenter> 
{ 

} 
+0

謝謝理查德,會試試這種方法。 – 2011-03-23 16:39:39

相關問題