繁体   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