все.Возникают трудности в структурировании приложения и применении шаблонов проектирования.Первоначально думал о модели стратегии.
- Я хочу общий интерфейс для настройки и получения деталей и деталей;
- Реализации интерфейса подходят для разных контекстов (например, мебель, игрушка), но все имеют одинаковые действия, используют реализацию
- в соответствии с используемым контекстом, все элементы являются производными от устаревшего BaseItem, у которого нет свойств
Что мне нужно:
/*client code*/
IItemHolder<BaseItem> itemHolder = null; // want to make it generic, abstract
switch (context)
{
case "BigItems":
// Error "Cannot implicitly convert 'type' implementation to 'interface'
itemHolder = new BigItemHolder();
break;
case "SmallItems":
//itemHolder = new SmallItemHolder();
break;
}
string itemId = Session.GetItemIdByTypeId(itemHolder.ItemTypeIdConstant);
var item = itemHolder.GetItem(itemId);
string itemProperty = itemHolder.GetItemProperty(item);
/* structure I have */
class BaseItem { }
class BigItem : BaseItem { }
/* structure I am trying to implement */
interface IItemHolder<TBase> where TBase : BaseItem
{
string ItemTypeIdConstant { get; }
string GetItemProperty(TBase item);
TBase GetItem(string itemId);
}
class BigItemHolder : IItemHolder<BigItem>
{
public string ItemTypeIdConstant => throw new NotImplementedException();
public BigItem GetItem(string itemId) { /**/ }
public string GetItemId(BigItem item) { /**/ }
public string GetItemProperty(BigItem item) { /**/ }
}
Ковариантность и контравариантность в интерфейсе мне мало помогают, так как один и тот же параметр может быть введен и выведен, если только не разделить один универсальный тип на два универсальных типа илидобавление делегатов для возврата получателя / установщика.Но это уже начинает пахнуть.Ищем идеи реализации