【发布时间】:2010-08-27 01:22:51
【问题描述】:
在我当前的项目中,我需要能够同时拥有可编辑和只读版本的类。因此,当类显示在 List 或 PropertGrid 中时,用户无法编辑不应被允许的对象。
为此,我遵循下图所示的设计模式。我从一个只读接口 (IWidget) 开始,然后创建一个实现该接口的可编辑类 (Widget)。接下来我创建一个只读类(ReadOnlyWidget),它简单地包装了可变类并实现了只读接口。
我对许多不同的不相关类型都遵循这种模式。但是现在我想在我的程序中添加一个搜索功能,它可以生成包括任何类型的结果,包括可变和不可变版本。所以现在我想添加另一组定义适用于所有类型的属性的接口(@987654326@、IMutableItem)。所以IItem 定义了一组通用的不可变属性,IMutableItem 定义了相同的属性但可编辑。最后,搜索将返回 IItems 的集合,如果需要,以后可以将其转换为更具体的类型。
但是,我不确定我是否正确设置了与 IMutable 和 IItem 的关系。现在我的每个接口(@987654333@,IDooHickey)都继承自IItem,然后可变类(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 和 set 的属性),并且效果很好。您也可以考虑将 SetXXX 之类的方法添加到 IMutableItem,而不是使用 setter 的新属性(请参阅stackoverflow.com/questions/623824/…)。
标签: c# .net interface class-design readonly