簡體   English   中英

通用接口實現混亂

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM