通用接口实现混乱

时间:2018-09-04 11:13:47

标签: c# generics interface

我对接口实现有些混乱,所有尝试的“修复”似乎都使整个解决方案更加复杂和混乱。我敢肯定有一个简单的答案,但目前我还不太清楚!

我有这两个接口(第二个用于第一个列表):

sleep

我有第三个接口,该接口由几个不同的类实现:

import pip

pip.main(['install','nltk'])

from nltk import *

以下是我的(不正确的)实现尝试:

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; }
}

此刻我遇到的主要错误是在APEditViewModel中,这是(减少的)错误:

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; } } 接口需要在类型接口(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>'. )中输入类型。

对不起,我没有说清楚自己的意思,很难解释,因为我不确定我要去哪里错,所以我会尝试回答/更新我的问题。

2 个答案:

答案 0 :(得分:3)

将您的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,则还需要使其通用。

答案 1 :(得分:0)

您需要为我们提供整个业务场景,以期获得正确的设计建议。

在上述示例中,问题是: 您定义的界面:

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

但是在调用时,您将APEntryEditViewModel传递为特定于接口的类型。 OOPS错了。

要成功编译您的

APEntryEditViewModel必须是IUserDefinedListEntryEditViewModel的实现