[英]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.