gpt4 book ai didi

C# 泛型 : Explicit restate of inherited constraints in overriden methods could break polymorphism?

转载 作者:太空宇宙 更新时间:2023-11-03 22:12:08 25 4
gpt4 key购买 nike

Mark Michaelis 在他的书(C# 4.0 Essentials)中写道:

class EntityBase<T> where T : IComparable<T>
{
public virtual void Method<T>(T t)
where T : IComparable<T>
{
// ...
}
}

class Entity<T> : EntityBase<T> where T : IComparable<T>
{
public override void Method<T>(T t)
// Error: Constraints may not be
// repeated on overriding members
where T : IComparable<T>
{
// ...
}
}

However, overriding members need to conform to the “interface” defined in the base class method. Additional constraints could break polymorphism, so they are not allowed and the type parameter constraints on the override method are implied.

有人可以向我解释打破多态性是什么意思吗?在这个例子中,多态性如何打破?

最佳答案

他的示例令人困惑,部分原因是(不正确,IMO)重新使用了 T对于泛型类型中的泛型方法。两个T不一样!所以;让我们使用非泛型类型:

class EntityBase
{
public virtual void Method<T>(T t)
where T : IComparable<T>
{
// ...
}
}

class Entity : EntityBase
{
public override void Method<T>(T t)
// Error: Constraints may not be
// repeated on overriding members
where T : IComparable<T>, ISomethingElse
{
// ...
}
}

这里我加了ISomethingElse - 显然,第二种方法可以尝试使用第二种方法的特征 T - 但是,调用者可能是:

EntityBase foo = GetEntity(); // is actually an Entity (sub-type) instance
foo.Method<SomeType>();
...
EntityBase GetEntity() { return new Entity(); }

基本实现不强制执行 ISomethingElse ,所以编译器不会提示它没有实现。那么重写的方法有什么作用呢?因此它不可能存在。

但是!相反,如果您在类型级别执行此操作,它确实有效,因为对于存在的具体对象我们知道约束是强制执行的:

class EntityBase<T> where T : IComparable<T>
{
public virtual void Method(T t)
{
// ...
}
}

class Entity<T> : EntityBase<T>
where T : IComparable<T>, ISomethingElse
{
public override void Method(T t)
{
// ... can use ISomethingElse features
}
}

还有一个简短的提醒——如果你有一个带有 <T> 的泛型类型, 不要同时使用 <T>在通用方法中;更具体的东西,比如 TValue等等……

关于C# 泛型 : Explicit restate of inherited constraints in overriden methods could break polymorphism?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6242823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com