我对接口实现有些混乱,所有尝试的“修复”似乎都使整个解决方案更加复杂和混乱。我敢肯定有一个简单的答案,但目前我还不太清楚!
我有这两个接口(第二个用于第一个列表):
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>'.
)中输入类型。
对不起,我没有说清楚自己的意思,很难解释,因为我不确定我要去哪里错,所以我会尝试回答/更新我的问题。
答案 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的实现