我知道问题可以通过说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 :(得分:3)
您的代码的问题在于您将委托传递给某个实例的方法(您自己),而您想要的是在所有小兵上调用某个方法。
您可以使用lambda表达式,例如
public void Dispose()
{
TellMinionsTo(minion=>minion.Dispose());
}
private void TellMinionsTo(Action<ManagableClass> doSomething)
{
foreach (ManagableClass minion in minions)
{
doSomething(minion);
}
}
我不喜欢直接使用List的方法。明天你将不得不通过一个界面工作,你的IList可能根本不必是一个列表。
答案 1 :(得分: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());
}
}
这就是你要找的东西吗?