Не удается неявно преобразовать реализацию типа в интерфейс - PullRequest
0 голосов
/ 20 сентября 2019

все.Возникают трудности в структурировании приложения и применении шаблонов проектирования.Первоначально думал о модели стратегии.

  • Я хочу общий интерфейс для настройки и получения деталей и деталей;
  • Реализации интерфейса подходят для разных контекстов (например, мебель, игрушка), но все имеют одинаковые действия, используют реализацию
  • в соответствии с используемым контекстом, все элементы являются производными от устаревшего 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) { /**/ }
}

Ковариантность и контравариантность в интерфейсе мне мало помогают, так как один и тот же параметр может быть введен и выведен, если только не разделить один универсальный тип на два универсальных типа илидобавление делегатов для возврата получателя / установщика.Но это уже начинает пахнуть.Ищем идеи реализации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...