有接口列表的接口,如何选择接口实现的类型
Interface with a list of interface, how to choose one type implemented by interface
这是我在 Whosebug 上的第一个问题,如果我做错了什么请原谅并告诉我。
问题:
我写了一些连接到数据库和文本文件等的字典。没有商业,只是学习。为了更好的解释,它可以是英法。
我想重构代码,以便有可能使用一种 "general" 方法来处理英法和法英词典模型的入口。一开始我为他们每个人制作了单独的模型(如果需要我会粘贴)现在我想制作所有东西 "universal"。我做了什么直到我停下来:
public interface IWordModel
{
int Id { get; set; }
string Name { get; set; }
string Definition { get; set; }
}
class 实施 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; }
}
Class 实施 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){
( ... )}
但它已经显示 "Using generic type requires 1 type arguments"。
谢谢,祝你有个愉快的一天!
听起来您需要 两个 个通用参数 - 一个应用于 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 {(...)}
但现在我有另一个问题想在这里解决。
例如,我想创建一些方法来从列表中删除重复项,但我希望这是实现 IDictionairyModel
的所有 class 的一种方法
public static List<IDictionairyModel<IWordModel, IWordModel>> RemoveDuplicates(this List<IDictionairyModel<IWordModel, IWordModel>> model)
{
(...) return model;
}
我需要做什么才能在
上使用此扩展方法
List<FrenchDictionairyModel> model = new List<FrenchDictionairymodel>();
model.RemoveDuplicates();
至于现在 return 错误。
我是否应该让 FrenchDictionairyModel 也像这样通用:
public class PoznanPolishDictionairyModel<T,U> : IDictionairyModel<PoznanWordModel, PolishWordModel>
where T:IWordModel
where U:IWordModel
???正确的做法是什么
非常感谢!!!
祝你有个愉快的星期天!
此致
这是我在 Whosebug 上的第一个问题,如果我做错了什么请原谅并告诉我。
问题:
我写了一些连接到数据库和文本文件等的字典。没有商业,只是学习。为了更好的解释,它可以是英法。
我想重构代码,以便有可能使用一种 "general" 方法来处理英法和法英词典模型的入口。一开始我为他们每个人制作了单独的模型(如果需要我会粘贴)现在我想制作所有东西 "universal"。我做了什么直到我停下来:
public interface IWordModel
{
int Id { get; set; }
string Name { get; set; }
string Definition { get; set; }
}
class 实施 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; }
}
Class 实施 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){
( ... )}
但它已经显示 "Using generic type requires 1 type arguments"。
谢谢,祝你有个愉快的一天!
听起来您需要 两个 个通用参数 - 一个应用于 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 {(...)}
但现在我有另一个问题想在这里解决。 例如,我想创建一些方法来从列表中删除重复项,但我希望这是实现 IDictionairyModel
的所有 class 的一种方法 public static List<IDictionairyModel<IWordModel, IWordModel>> RemoveDuplicates(this List<IDictionairyModel<IWordModel, IWordModel>> model)
{
(...) return model;
}
我需要做什么才能在
上使用此扩展方法List<FrenchDictionairyModel> model = new List<FrenchDictionairymodel>();
model.RemoveDuplicates();
至于现在 return 错误。 我是否应该让 FrenchDictionairyModel 也像这样通用:
public class PoznanPolishDictionairyModel<T,U> : IDictionairyModel<PoznanWordModel, PolishWordModel>
where T:IWordModel
where U:IWordModel
???正确的做法是什么
非常感谢!!!
祝你有个愉快的星期天!
此致