这是我关于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>());
}
我的问题
如何做到这一点,即在FrenchDictionairyModel实例中,我们只能将BaseWord定义为FrenchWordModel,并且仅将EnglishWordModel添加到DerivativeWords列表中?我知道它在协方差和协方差方面有共同点,但我不知道如何在此处应用。
从经验丰富的编码人员的角度来看,以上代码是否具有某种意义,或者仅在我头上看起来还可以?如果回答为“否”,那么它应该是什么样子?我应该使用哪种模式?
如何在其他方法中正确使用它?到目前为止,我正在使用
public List<EnglishFrenchDictionairyModel>
CreateEnglishFrenchEntrance(List<EnglishFrenchDictionairyModel> model){
(...)}
,但已经显示“使用泛型类型需要1个类型参数”。
谢谢,祝你有美好的一天!
答案 0 :(得分:0)
听起来您需要两个通用参数-一个适用于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>();
}
答案 1 :(得分:0)
谢谢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
???正确的方法是什么
非常感谢!
周日愉快!
最好的问候