每隔一段时间,我就会通过向其添加自引用(“自反”)类型参数约束来使简单接口变得更加复杂。例如,我可能会这样:
interface ICloneable
{
ICloneable Clone();
}
class Sheep : ICloneable
{
ICloneable Clone() { … }
} //^^^^^^^^^^
Sheep dolly = new Sheep().Clone() as Sheep;
//^^^^^^^^
进入:
interface ICloneable<TImpl> where TImpl : ICloneable<TImpl>
{
TImpl Clone();
}
class Sheep : ICloneable<Sheep>
{
Sheep Clone() { … }
} //^^^^^
Sheep dolly = new Sheep().Clone();
主要优点:实现类型(例如Sheep
)现在可以引用自身而不是其基类型,从而减少了类型转换的需要(如最后一行代码所示)。
虽然这非常好,但我也注意到这些类型参数约束不直观,并且在更复杂的场景中变得非常难以理解。*)
问题:有谁知道另一种 C# 代码模式可以实现相同的效果或类似的东西,但以更容易掌握的方式?
*)此 Code Pattern 可能不直观且难以理解,例如:
该声明
X<T> where T : X<T>
似乎是递归的,有人可能想知道为什么编译器不会陷入无限循环,推理,“如果T
是一个X<T>
,那么X<T>
真的是一个X<X<…<T>…>>
。” (但约束显然不会像那样得到解决。)对于实现者来说,应该指定什么类型来代替
TImpl
. (约束最终会解决这个问题。)一旦您在混合中添加更多类型参数和各种通用接口之间的子类型关系,事情就会很快变得难以管理。