簡體   English   中英

具有接口列表的接口,如何選擇由接口實現的一種類型

[英]Interface with a list of interface, how to choose one type implemented by interface

這是我關於StackOverflow的第一個問題,所以請原諒並告訴我我做錯了什么。

問題:

我寫了一些字典,連接到數據庫和文本文件等。沒有什么商業意義,只是學習而已。 為了更好的解釋,它可以是英語-法語。

我想重構代碼以使用一種“通用”方法來處理英法詞典和法英詞典模型的輸入的可能性。 一開始,我為每個模型創建了單獨的模型(如有必要,我將粘貼),現在我想使所有模型“通用”。 直到停下腳步,我所做的一切:

public interface IWordModel 
{

    int Id { get; set; }
    string Name { get; set; }
    string Definition { get; set; }
}

實現IWordModel的類:

public class EnglishWordModel: IWordModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Definition { get; set; } = null;
}
public class FrenchWordModel : IWordModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Definition { get; set; } = null;
}

實現IWordModel的接口和該接口的問題列表:

public interface IDictionairyModel<T> where T : IWordModel
{
    int Id { get; set; }
    T BaseWord { get; set; }
    List<T> DerivativeWords { get; set; }
}

實現IDicionairyModel的類

public class EnglishFrenchDictionairyModel<T>: IDictionairyModel where T : IWordModel
{
    public int Id { get; set; }
    public IWordModel BaseWord { get; set; } = new EnglishWordModel();
    public List<IWordModel> DerivativeWords { get; set; } =  = new 
    List<IWordModel>(new List<FrenchWordModel>());
}
public class FrenchDictionairyModel: IDictionairyModel<T> where T : IWordModel
{
    public int Id { get; set; }
    public IWordModel BaseWord { get; set; } = new FrenchWordModel();
    public List<IWordModel> DerivativeWords { get; set; } =  = new 
    List<IWordModel>(new List<EnglishWordModel>());
}

我的問題

  1. 如何做到這一點,即在FrenchDictionairyModel實例中,我們只能將BaseWord定義為FrenchWordModel,並且僅將EnglishWordModel添加到DerivativeWords列表中? 我知道協方差和協方差有一些共同點,但我不知道如何在這里應用。

  2. 從經驗豐富的編碼人員的角度來看,上面的代碼是否具有某種意義,或者僅在我腦海中看起來還可以? 如果答案為“否”,那么它將是什么樣子,我應該使用哪種模式?

  3. 如何以其他方式正確使用它? 就像現在我正在使用

     public List<EnglishFrenchDictionairyModel> CreateEnglishFrenchEntrance(List<EnglishFrenchDictionairyModel> model){ 

    (...)}

    但其已顯示“使用泛型類型需要1個類型參數”。

謝謝,祝你有美好的一天!

聽起來您需要兩個通用參數-一個適用於BaseWord ,另一個適用於DerivativeWords

public interface IDictionairyModel<T,U> 
    where T : IWordModel, U : IWordModel
{
    int Id { get; set; }
    T BaseWord { get; set; }
    List<U> DerivativeWords { get; set; }
}

然后這樣定義FrenchDictionaryModel

public class FrenchDictionairyModel: 
    IDictionairyModel<FrenchWordModel, EnglishWordModel>
{
    public int Id { get; set; }
    public FrenchWordModel BaseWord { get; set; } = new FrenchWordModel();
    public List<EnglishWordModel> DerivativeWords { get; set; } =  new List<EnglishWordModel>();
}

謝謝D史丹利! 它工作正常,只需為U和T添加兩個where子句即可:

public interface IDictionairyModel<T,U> 
where T : IWordModel,
where U : IWordModel {(...)}

但是現在我有另一個問題想在這里實施。 例如,我想創建一些方法,該方法將從List中刪除重復項,但是我希望這對實現IDictionairyModel的所有類都是一個方法

        public static List<IDictionairyModel<IWordModel, IWordModel>> RemoveDuplicates(this List<IDictionairyModel<IWordModel, IWordModel>> model)
    {
        (...)  return model;
    }

我需要做些什么才能能夠使用此擴展方法

List<FrenchDictionairyModel> model = new List<FrenchDictionairymodel>();
model.RemoveDuplicates();

至於現在,它返回錯誤。 我應該讓FrenchDictionairyModel也通用嗎?

public class PoznanPolishDictionairyModel<T,U> : IDictionairyModel<PoznanWordModel, PolishWordModel>
where T:IWordModel
where U:IWordModel

??? 什么是正確的方法

非常感謝!!!

祝你有個美好的星期天!

最好的祝福

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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