2012-03-06 73 views
1

我正在开发中,我有两个组的一个类库:分配“操作”的对象

A)几个类与一组函数,或者“行动”,已经写在代码

B)必须“配置”几类时实例化,在某种程度上,使用我的图书馆用户可以从该第二组的类实例化对象,并从第一组“指定”动作

眼下我正在使用代表,如下所示:

Somwhere在代码中,我声明,是由一个使用了一些代表和B:

public delegate void Action03(int value); 

然后我有“行动”,在A组中实现:

public Delegates.Action03 DoSomething03 = delegate(int value) { [code to execute when this action is specified on the constructor] }; 

最后,我们使用的构造函数,如下面以实例从B组,我们作为参数传递代表/我们要的是行动对象:

public SomethingGroupB(Delegates.Action03 act03) { ... } 

那么当然,我们可以通过实例化代表作为参数对象:

SomethingGroupB somthg1 = new SomethingGroupB(GrpA01.DoSomething03); 

但整个的一点是,我们可以实例相似的对象,但分配不同的操作:

SomethingGroupB somthg2 = new SomethingGroupB(GrpA07.DoSomething03); 
SomethingGroupB somthg3 = new SomethingGroupB(GrpA01.DoSomething01); 
SomethingGroupB somthg4 = new SomethingGroupB(GrpA02.DoWhatever); 

所以......作为总结,我想有预编码(在我的图书馆)操作,并且用户必须在实例化时选择分配给新对象的操作,并且这些操作不会更改。

我想我也可以用事件做到这一点,但我并不需要添加和删除“动作”,他们是固定的类型B的每个对象的整个生命

所以我的问题是:是否有比我用代表实现的更好,更好,更清洁的解决方案?

非常感谢!

回答

2

所以我的问题是?有没有比我用代表实现的更好,更好,更干净的解决方案?

我建议的一个改进是使用在框架中定义的委托,而不是定义你自己的。 ,您的Action03代表只是一个System.Action<int>。这将提供一个位在使API更易被发现方面提供可用性。

这就是说,这是有效地使用代表来实现Strategy pattern。如果这提供了您所需的全部功能,那么它可能是一个很好的选择,而且非常干净。

+0

非常感谢。 'System.Action '看起来像是正确的解决方案,但是......必须返回值的动作/代表怎么办? – Felko 2012-03-07 17:21:57

+0

@Felko你可以使用'System.Func ','System.Func '等。 – 2012-03-07 18:33:37

0

我认为代表是唯一的出路。

也许你也可以使用装饰模式,如果它适合你的需要?它非常干净,并且因为它的模式,标准和“容易”理解为以某种方式规范化。

不能或许想到的任何其他方式,APPART从具有较重的使用对象组成的(然后在运行时你的对象一起链接,这可能是多一点suple