Общая путаница в реализации интерфейса - PullRequest
0 голосов
/ 04 сентября 2018

Я немного запутался в реализации интерфейса, все мои попытки сделать исправления, кажется, делают все решение более сложным и сломанным. Я уверен, что есть простой ответ, но я пока не могу его увидеть!

У меня есть эти два интерфейса (второй используется в списке первого):

public interface IUserDefinedListEditViewModel<T> where T : IUserDefinedListEntryEditViewModel<IBaseUserDefinedListModel>
{
    string TypeName { get; set; }
    IList<T> UserDefinedListEntries { get; set; }
}

public interface IUserDefinedListEntryEditViewModel<T> where T : IBaseUserDefinedListModel
{
    string Display { get; set; }
    T UserDefinedListEntry { get; set; }
}

У меня есть третий интерфейс, который реализован несколькими различными классами:

public interface IBaseUserDefinedListModel
{
    Guid Id { get; set; }
    string Name { get; set; }
    bool IsSystem { get; set; }
}

Ниже приведена моя (неверная) попытка реализации:

public class APEditViewModel : IUserDefinedListEditViewModel<APEntryEditViewModel>
{
    public string TypeName { get; set; }
    public IList<APEntryEditViewModel> UserDefinedListEntries { get; set; } = new List<APEntryEditViewModel>();
}

public class APEntryEditViewModel : IUserDefinedListEntryEditViewModel<APModel>
{
    public string Display { get; set; }
    public APModel UserDefinedListEntry { get; set; }
}

public class BaseUserDefinedListModel : IBaseUserDefinedListModel
{
    public Guid Id { get; set; }
    [Required(ErrorMessage = "The Name field is required.")]
    public string Name { get; set; }
    public bool IsSystem { get; set; }
}

public class APModel : BaseUserDefinedListModel
{
    public string NewValue { get; set; }
}

Основная ошибка, которую я получаю в данный момент, заключается в APEditViewModel, вот (урезанная) ошибка:

The type 'APEntryEditViewModel' cannot be used as type parameter 'T' in the
generic type or method 'IUserDefinedListEditViewModel<T>'. There is no 
implicit reference conversion from 'APEntryEditViewModel' to 
'IUserDefinedListEntryEditViewModel<IBaseUserDefinedListModel>'.

Я не уверен, нужен ли мне этот уровень универсальных интерфейсов, но из моих исследований и экспериментов я считаю, что мне это нужно. Я просто не совсем понимаю, и я думаю, что интерфейс IUserDefinedListEditViewModel, которому нужен тип в интерфейсе типов (IUserDefinedListEntryEditViewModel), кажется неправильным.

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

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Вы должны предоставить нам весь бизнес-сценарий для ожидания правильных проектных предложений.

В приведенных выше примерах проблема заключается в следующем: Ваш определенный интерфейс ::

interface IUserDefinedListEditViewModel<T> where T : IUserDefinedListEntryEditViewModel<IBaseUserDefinedListModel>

Но во время вызова вы передаете APEntryEditViewModel в качестве интерфейса определенного типа. Что не так с OOPS.

Чтобы успешно скомпилировать это

APEntryEditViewModel должен быть следствием IUserDefinedListEntryEditViewModel

0 голосов
/ 04 сентября 2018

Измените свой IUserDefinedListEditViewModel интерфейс на:

public interface IUserDefinedListEditViewModel<T1,T2> 
           where T1 : IUserDefinedListEntryEditViewModel<T2> 
           where T2 : IBaseUserDefinedListModel

После этого и обновить реализацию в APEditViewModel:

public class APEditViewModel : IUserDefinedListEditViewModel<APEntryEditViewModel, APModel>

Ошибка указывает, что с общим ограничением

where T : IUserDefinedListEntryEditViewModel<IBaseUserDefinedListModel>

только IUserDefinedListEntryEditViewModel<IBaseUserDefinedListModel> и типы, которые реализуют этот интерфейс, будут приняты как T. Если вы хотите, чтобы любой IBaseUserDefinedListModel был принят в параметре типа T, вам также нужно сделать его общим.

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