[英]Generic interface implementation confusion
我对接口实现有点混乱,所有我尝试过的'修复'似乎都让整个解决方案变得更加复杂和破碎。 我确信有一个简单的答案,但我现在看不到它!
我有这两个接口(第二个在第一个列表中使用):
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
)似乎是错误的。
对不起,我不是那么清楚,解释起来相当棘手,因为我不确定我哪里出错,所以我会尝试回答/更新我的问题。
将您的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
如果您希望在T
的类型参数中接受任何IBaseUserDefinedListModel
,您还需要使其成为通用的。
您需要为我们提供整个业务场景,以期获得正确的设计建议。
如上例所示,问题是:您定义的接口::
interface IUserDefinedListEditViewModel<T> where T : IUserDefinedListEntryEditViewModel<IBaseUserDefinedListModel>
但在调用时,您将APEntryEditViewModel作为接口特定类型传递。 OOPS哪个错了。
要成功编译你的
APEntryEditViewModel必须是IUserDefinedListEntryEditViewModel的实现
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.