2014-05-17 15 views
2

我知道這個問題可以通過說foreach(var item in items){item.doSomething()};來回答,但是我後面的內容稍有不同。這是接口。如何使接口列表執行一個動作

ManagableClass的.cs

public interface ManagableClass : System.IDisposable 
{ 
    void Initialize(); 
} 

以下是我想看到我的代碼看起來像

MainManagerClass.cs

public class MainManagerClass: ManagableClass 
{ 
    private List<ManagableClass> minions; 

    public void Initialize() 
    { 
     TellMinionsTo(Initialize); 
    } 

    public void Dispose() 
    { 
     TellMinionsTo(Dispose); 
    } 

    private void TellMinionsTo(Action doSomething) 
    { 
     foreach (ManagableClass minion in minions) 
     { 
      minion.doSomething(); 
     } 
    } 
} 

我知道這個代碼那在這裏是行不通的,但是看起來這個應該是在C#中可行。任何人都知道這是可以做到的嗎?如果不是,它不像是世界末日,我會在每種方法中做一個foreach

+0

是在每個界面中都將相同的小爪牙的列表嗎?即所有派生類應該工作w。同一個列表? –

+0

爪牙列表將是'ManagableClass'類型,所以他們將擁有2種方法(初始化和處置) –

回答

3

你的代碼的問題在於你將一個委託傳遞給某個實例的某個方法(你自己),而你想要的是調用某個方法在所有的小方法上。

您可以使用lambda表達式,像

public void Dispose() 
{ 
    TellMinionsTo(minion=>minion.Dispose()); 
}  


private void TellMinionsTo(Action<ManagableClass> doSomething) 
{ 
    foreach (ManagableClass minion in minions) 
    { 
     doSomething(minion); 
    } 
} 

我不喜歡直接用列表的方法。明天你將不得不通過一個接口工作,你的IList可能不一定是一個List。

+0

+1 - 打敗我吧。 –

+0

我決定切換到你的答案,因爲雖然Gretro間接地回答了我的問題(我用ForEach方法查看了intellisense,並驚訝它會提供你的答案)。但我喜歡代碼的讀法,而不是'minions.ForEach(i => i.Dispose());' –

2

你在找什麼是Composite pattern。這種模式將允許您有一個類將實現正確的方法,並將其與項目列表不同。然而,就你而言,你需要修改你的界面來實現DoSomething()方法。所以,這應該看起來像這樣。

public interface ISomething 
{ 
    void DoSomething(); 
} 

public class SomethingManager : ISomething 
{ 
    private List<ISomething> _items = new List<ISomething>(); 

    public void DoSomething() 
    { 
     _items.ForEach(i => i.DoSomething()); 
    } 
} 

這是你在找什麼?

+0

儘管它不完全是我之後的,但我不知道List有一個ForEach的擴展方法。間接你回答了我的問題。不知怎的,我以爲我正在實施Builder設計模式(同一網站),謝謝你糾正我。 –

相關問題