2012-06-17 103 views
3

我有一個主類,有幾個繼承成員,它們都重載父類的相同Draw方法,但具有不同的Initialize方法。是否有可能爲每個繼承類使用相同的列表類型,從而能夠遍歷Draw方法?我非常肯定你可以用C++中的模板來做到這一點,但似乎無法找到在C#中使用它的方法。這裏有一個例子:如何在C#中創建通用列表/模板列表

class MainMenu : ExpandingWindow{ 
    Init(A,B) 
    Draw(D) 
} 

class SideMenu : ExpandingWindow{ 
    Init(A,B,C) 
    Draw(D) 
} 

我希望能夠做到:

WindowList List<ExpandingWindow> 

WindowList.Add(new MainMenu) 
WindowList.Add(new SideMenu) 

WindowList[0].Initialize(A,B) 
WindowLIst[1].Initialize(A,B,C) 

和:

for each window in WindowList{ 
    window.Draw(D) 
} 

我敢肯定我在這裏失去了一些東西。我不必以這種確切的方式去做,我寧願尋找處理這些情況的一般方法。

謝謝!

回答

2

嘗試:

IList<ExpandingWindow> windows = new List<ExpandingWindow>(); 

// initialize them via constructor 
windows.Add(new MainMenu(A, B));  
windows.Add(new SideMenu(A, B, C)); 

foreach(var window in windows) { 
    window.Draw(); 
} 
+0

這似乎解決了列表問題,謝謝! –

0

你必須創建在基類ExpandingWindow一個抽象虛擬方法,然後重寫派生類方法。

另一個選項是定義一個IExpandingWindow接口,它有一個Draw方法,並在您的類中實現它。

+0

我聽起來像Tormod已經做到了,但在創建通用列表時遇到了問題。 – Zbigniew

+0

我已經將Init方法實現爲抽象,並將Draw繪製爲虛擬。儘管如此,我可能做得很糟糕。截至目前,我將不得不在Initiation方法中爲繼承類中的每個不同的Init方法(由於不同的方法參數)重載Init方法。有沒有辦法解決?將實施ExpandingWindows作爲界面有幫助嗎? –

1

如果每個子類都有不同的方法,那麼它們不屬於該接口,並且不能在沒有顯式投射的情況下調用(這在OOP中是一件壞事)。

你可能想要做的是通過參數的構造,然後調用具有相同簽名的接口方法:

class ExpandingWindow 
{ 
    public virtual void Draw(D obj) { ... } 
} 

public class MainMenu : ExpandingWindow 
{ 
    public MainMenu(A a, B b) 
    { 
     // assign MainMenu-specific parameters 
    } 

    // inherit Draw from the base class, 
    // or override it if necessary 
} 

public class SideMenu : ExpandingWindow 
{ 
    public SideMenu(A a, B b, C c) 
    { 
     // assign SideMenu-specific parameters 
    } 

    // inherit Draw from the base class, 
    // or override it if necessary 
    public override Draw(D d) 
    { 
     // some side-menu specific stuff 
     d.DoStuff(); 

     // call the base method after that 
     base.Draw(d); 
    } 
} 

然後,您將通過具體的參數時創建具體實例(因爲在這個時候你必須知道你正在實例化哪個類):

List<ExpandingWindow> windows = new List<ExpandingWindow>(); 

windows.Add(new MainMenu(a, b)); 
windows.Add(new SideMenu(a, b, c)); 

foreach (var w in windows) 
    w.Draw(d); 
+0

我很高興你提出這個問題,因爲我雖然完全一樣! :)我雖然嘗試過,但我偶然發現了另一個問題。有: MainMenu(A,B,C) 作爲構造函數,它沒有工作,編寫 list.Add(新MainMenu(A,B,C)) 編譯器告訴我,沒有方法帶有3個參數,我相信這是...所以我一定錯過了一些東西! –

+0

從您的評論,我給了它另一個嘗試。好像我在構造函數中包含了一個void語句。我刪除了虛空,現在它工作。很好的反饋。謝謝! –