我得到继承,我只是不明白为什么这个接口实现自己?
另外,请你解释一下这个大胆的部分有什么作用?为什么我不能只说出哪个T是IIdentifiableEntity,而不是所有逗号分隔的部分?
public interface IDataRepository<T> : IDataRepository
**where T : class, IIdentifiableEntity, new()**
答案 0 :(得分:3)
这里不止一个问题..我将逐一解决这些问题:
为什么这个界面实现了自己?
它没有。这里有两种类型..一种通用..一种非泛型。为什么它实现非泛型?谁知道..我们需要看到整个数据层才能理解。重要的是要认识到它们有两种类型。
为什么我不能只说出哪个T是IIdentifiableEntity
同样,这取决于您的使用案例。 class
强制使用引用类型作为泛型参数。因此,您将无法创建IDataRepository<int>
的实例。这在数据层中是有意义的。因为您通常希望保留整个对象/图形,并且它们通常是引用类型。 new()
允许您在通用类型中使用var x = new T()
。如果没有它,如果尝试实例化泛型类型参数的实例,则会出现编译器错误。
答案 1 :(得分:1)
为通用集合类或表示集合中的项的泛型类定义接口通常很有用。泛型类的优先选择是使用通用接口,例如IComparable而不是IComparable,以避免对值类型进行装箱和拆箱操作。 .NET Framework类库定义了几个通用接口,用于System.Collections.Generic命名空间中的集合类。 将接口指定为类型参数的约束时,只能使用实现该接口的类型。以下代码示例显示了从GenericList类派生的SortedList类。有关更多信息,请参阅泛型简介(C#编程指南)。 SortedList在T:IComparable中添加约束。这使得SortedList中的BubbleSort方法可以对列表元素使用通用的CompareTo方法。在此示例中,list元素是一个实现IComparable的简单类Person。 Read
答案 2 :(得分:1)
有2个不同的接口IDataRepository
是通用的IDataRepository<T>
,它是通用的,仅限于具有参数较少的构造函数并实现IIdentifiableEntity
的类。当您的应用程序不仅与IDataRepository<T>
绑定,而且您可能有另一个通用接口(如IDataRepository<T> where T: IEntity
),并且在某些部分您希望将它们视为一个接口时,这非常有用
对于下一个问题,如果它只有where T : IIdentifiableEntity
,您可以将另一个interface
或struct
作为T传递,但架构师希望开发人员传递class
参数构造函数为T