2012-03-06 85 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