В моем текущем проекте мне нужно иметь как редактируемые, так и доступные только для чтения версии классов.Таким образом, когда классы отображаются в List или PropertGrid, пользователь не может редактировать объекты, на которые ему нельзя разрешать.
Для этого я следую шаблону проектирования, показанному на диаграмме ниже.Я начинаю с интерфейса только для чтения (IWidget
), а затем создаю редактируемый класс, который реализует этот интерфейс (Widget
).Затем я создаю класс только для чтения (ReadOnlyWidget
), который просто оборачивает изменяемый класс, а также реализует интерфейс только для чтения.
Я следую этому шаблону для ряда различных несвязанных типов.Но теперь я хочу добавить функцию поиска в мою программу, которая может генерировать результаты, которые включают любые типы, включая как изменяемые, так и неизменяемые версии.Поэтому теперь я хочу добавить еще один набор интерфейсов (IItem
, IMutableItem
), которые определяют свойства, которые применяются ко всем типам.Таким образом, IItem
определяет набор общих неизменяемых свойств, а IMutableItem
определяет те же свойства, но редактируемые.В конце поиска будет возвращен набор IItems
, который затем можно будет при необходимости привести к более конкретным типам.
Тем не менее, я не уверен, что я устанавливаю отношения к IMutable
и IItem
правильно.Прямо сейчас у меня есть каждый из интерфейсов (IWidget
, IDooHickey
), наследуемых от IItem
, и затем изменяемые классы (Widget
, DooHickey
), кроме того, также реализуют IMutableItem
.
В качестве альтернативы я также подумал, что мог бы установить IMutableItem
для наследования от IItem
, что скрыло бы его свойства только для чтения с новыми свойствами, которые имеют как get, так и set accessors.Тогда изменяемые классы реализуют 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();
}
}