2

質問は言うことで答えられることは知っていますがforeach(var item in items){item.doSomething()};、私が求めているのは少し異なります。これがインターフェースです。

管理可能なクラス .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、各メソッドで a を実行します。

4

2 に答える 2

3

コードの問題は、特定のインスタンス (自分自身) のメソッドにデリゲートを渡すことですが、必要なのはすべてのミニオンで特定のメソッドを呼び出すことです。

次のようなラムダ式を使用できます

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


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

List のメソッドを直接使用するのは好きではありません。明日はインターフェイスを介して作業する必要があり、IList はリストである必要はまったくないかもしれません。

于 2014-05-17T18:44:54.380 に答える
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());
    }
} 

それはあなたが探しているものですか?

于 2014-05-17T18:31:50.737 に答える