在大多数地方,我读到在类中同时继承IComparable和IComparable<T>是一个好主意,以提供与非泛型集合的兼容性。我的问题是,为什么IComparable<T>在默认情况下不继承IComparable?通过这种方式可以实现向后兼容。
例如,IEnumerable<T>确实继承了IEnumerable,那么为什么不对IComparable做同样的事情呢?我读过关于差异的文章,但我仍然不能真正理解为什么它是这样设计的。我尝试创建一个具有相同架构的接口的小示例,它按预期工作。
编辑:另外,Microsoft文档声明:如果泛型接口是逆变量,则泛型接口可以从非泛型接口继承,这意味着它只使用其类型参数作为返回值。在.NET框架类库中,IEnumerable<T>继承自IEnumerable,因为IEnumerable<T>仅在GetEnumerator的返回值和Current属性获取方法中使用T。
尽管如此,人们可以很好地从IComparable<T>继承IComparable (如果您使用相同的体系结构创建接口)。
发布于 2019-09-23 23:09:04
如果未指定type,则实现泛型接口的类也需要实现默认类型方法
public interface IFoo
{
void Foo(object o);
}
public interface IFoo<T> : IFoo
{
void Foo(T o);
}这就变成了
public class Foo : IFoo<int>
{
void IFoo<int>.Foo(int o)
{
throw new System.NotImplementedException();
}
void IFoo.Foo(object o)
{
throw new System.NotImplementedException();
}
}在本例中,您使用一个方法实现了一个接口,而且似乎必须实现两个方法,在这两个方法中继承自类型化接口
发布于 2019-09-23 23:19:14
这归根结底是一个语言设计决策,所以我们只能猜测一下开发人员的话。
一个很好的理由肯定是一个是通用的,另一个不是。泛型本质上优于非泛型解决方案(这意味着使用对象作为类型),因为它们在编译时维护类型安全。因此,可能是有意选择与前通用版本决裂。以避免向下兼容。请注意,大多数实现泛型版本的类都没有实现它的非泛型副本。真正的基础和旧东西,如字符串是例外-因为他们不能删除旧的接口,只能添加新的接口。
有了枚举器,这种需求就不那么极端了。枚举数通常是从集合中生成的,而不是从集合中生成的,并且是纯读取处理。因此,您要么也有固定类型要强制转换,要么有固定类型要在枚举器中使用。
另一个可能的原因是,使用IComparable的代码要么显式地要求它(类型约束),要么由由它构成的东西组成-并且根据定义本身是泛型的。它最常用于泛型集合中的排序函数。有可能他们不想再使用旧的收藏了。在字典中不支持IComparable当然是让HashTable (它的前类属对应项)退出流通的一个好选择。
https://stackoverflow.com/questions/58065180
复制相似问题