用单个调用调用接口集合的方法

3

我有如下内容:

public interface Client
{
    void Operation1();
    void Operation2();
}

public class Client1 : Client
{
    public void Operation1()
    {
        Console.WriteLine("Client1 - Operation1");
    }

    public void Operation2()
    {
        Console.WriteLine("Client1 - Operation2");
    }
}

public class Client2 : Client
{
    public void Operation1()
    {
        Console.WriteLine("Client2 - Operation1");
    }

    public void Operation2()
    {
        Console.WriteLine("Client2 - Operation2");
    }
}

public class Client3 : Client
{
    public void Operation1()
    {
        Console.WriteLine("Client3 - Operation1");
    }

    public void Operation2()
    {
        Console.WriteLine("Client3 - Operation2");
    }
}

我需要一种方法来通过单个调用调用所有客户端的方法。类似于委托。
基本上,我想要做以下事情:     Clients.Operation1() 输出:     Client1 - Operation1     Client2 - Operation1     Client3 - Operation1
实现这个的一种方法是拥有以下类:
public class Clients : Client
{
    public List<Client> Clients { get; set; }
    public void Operation1()
    {
        foreach(Client c in Clients)
        {
            c.Operation1();
        }
    }
    public void Operation2()
    {
        foreach (Client c in Clients)
        {
            c.Operation2();
        }
    }
}

但是每当我更改客户端接口时,我也必须更改客户端类。是否有一种动态生成客户端类(或类似物)的方法?

如果您需要更好的解释,请告诉我,因为我很难解释这个问题。


我明白了。看起来你所拥有的是很好的,而且它有一个名字叫做组合模式。当你修改其他客户端类时,为什么不能在客户端类中花费很少的时间添加一个方法呢? - Sriram Sakthivel
通常接口确保您的代码不会改变。为了解决这个问题,您可以有一个方法,它带有一个 Func 参数和您想要调用的方法,您就不必在 Clients 类中实现 Client 接口。 - Vsevolod Goloviznin
因为我非常固执,如果我只花时间在那个类中添加一个方法,我就不会学到任何东西。 - Phoenix
1个回答

5
您可以简单地实现一个方法Execute,并将您想要执行的方法传递给它:
public class Clients
{
    public List<Client> ClientList { get; set; }

    public void Execute(Action<Client> action)
    {
        ClientList.ForEach(action);
    }

}

用法:

new Clients().Execute(x => x.Operation1(someString, someInt));
new Clients().Execute(x => x.Operation2());

采用这个示例,您无需在Clients类中实现接口,也无需在每次接口更改时重新制作它。

另一个问题是:我该如何处理参数?一些方法确实需要参数。例如,Operation1可能需要一个字符串,而Operation2没有参数。我该如何相应地传递它们? - Phoenix
你只需要在调用函数中传递参数,我已经更新了答案。 - Vsevolod Goloviznin
只是不要忘记小心处理参数,因为你将它们带入了 clojure,所以我建议你在这个主题上多读一些。 - Vsevolod Goloviznin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接