如何创建接口列表以执行操作

时间:2014-05-17 18:21:07

标签: c# builder-pattern

我知道问题可以通过说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

2 个答案:

答案 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());
    }
} 

这就是你要找的东西吗?

相关问题