在我當前的項目中,我需要能夠同時具有可編輯和只讀版本的類。因此,當類在List或PropertGrid中顯示時,用戶不能編輯它們不應該被允許的對象。在複雜對象結構中創建類的只讀版本
爲此,我遵循下圖所示的設計模式。我從一個只讀接口(IWidget
)開始,然後創建一個實現此接口的可編輯類(Widget
)。接下來,我創建一個只讀類(ReadOnlyWidget
),它只是包裝可變類並實現只讀接口。
我遵循這種模式的一些不同的無關的類型。但是現在我想爲我的程序添加一個搜索函數,它可以生成包括各種類型(包括可變和不可變版本)的結果。所以現在我想添加另一組接口(IItem
,IMutableItem
),它們定義適用於所有類型的屬性。因此IItem
定義了一組通用的不可變屬性,並且IMutableItem
定義了相同的屬性但可編輯。最後,搜索將返回一個IItems
的集合,然後可以根據需要將其轉換爲更具體的類型。
但是,我不確定是否正確建立了與IMutable
和IItem
的關係。現在我有從IItem
繼承的每個接口(IWidget
,IDooHickey
),然後可變類(Widget
,DooHickey
)此外還實現了IMutableItem
。
另外,我也在想我可以設置IMutableItem
從IItem
繼承,這將隱藏它的只讀屬性,它具有get和set訪問器的新屬性。然後可變類將實現IMutableItem
,只讀類將實現IItem
。
我希望對此有任何建議或批評。
類圖
代碼
public interface IItem
{
string ItemName { get; }
}
public interface IMutableItem
{
string ItemName { get; set; }
}
public interface IWidget:IItem
{
void Wiggle();
}
public abstract class Widget : IWidget, IMutableItem
{
public string ItemName
{
get;
set;
}
public void Wiggle()
{
//wiggle a little
}
}
public class ReadOnlyWidget : IWidget
{
private Widget _widget;
public ReadOnlyWidget(Widget widget)
{
this._widget = widget;
}
public void Wiggle()
{
_widget.Wiggle();
}
public string ItemName
{
get {return _widget.ItemName; }
}
}
public interface IDoohickey:IItem
{
void DoSomthing();
}
public abstract class Doohickey : IDoohickey, IMutableItem
{
public void DoSomthing()
{
//work it, work it
}
public string ItemName
{
get;
set;
}
}
public class ReadOnlyDoohickey : IDoohickey
{
private Doohickey _doohicky;
public ReadOnlyDoohickey(Doohickey doohicky)
{
this._doohicky = doohicky;
}
public string ItemName
{
get { return _doohicky.ItemName; }
}
public void DoSomthing()
{
this._doohicky.DoSomthing();
}
}
我已經(從繼承的iItem和IMutableItem使用get添加有一個屬性和設置)在我的項目之一,它工作得很好。您也可以考慮將像SetXXX這樣的方法添加到IMutableItem中,而不是使用setter的新屬性(請參閱http://stackoverflow.com/questions/623824/add-set-to-properties-of-interface-in-c-sharp)。 – ttil 2012-01-16 23:37:40