我常常把自我参照(“灵活”)类型的参数限制加起来,使简单的接口变得更加复杂。 例如,我要谈谈:
interface ICloneable
{
ICloneable Clone();
}
class Sheep : ICloneable
{
ICloneable Clone() { … }
} //^^^^^^^^^^
Sheep dolly = new Sheep().Clone() as Sheep;
//^^^^^^^^
页: 1
interface ICloneable<TImpl> where TImpl : ICloneable<TImpl>
{
TImpl Clone();
}
class Sheep : ICloneable<Sheep>
{
Sheep Clone() { … }
} //^^^^^
Sheep dolly = new Sheep().Clone();
主要优势: 一种执行类型(例如<代码>Sheep)现在可以指自己,而不是指其基准类型,从而减少进行类型预测的需要(如最后一行的代码所示)。
虽然这是非常好的,但我也注意到,这些类型的参数制约因素并非直观的,而且有在更为复杂的情景中真正难以理解的趋势。
< Question: 是否有任何人了解另一个C#代码模式,这些模式取得了相同的效果或类似效果,但比较容易掌握?
<><><>>>> 这种守则模式可能不可靠,难以理解,例如:
The declaration
X<T> where T : X<T>
appears to be recursive, and one might wonder why the compiler doesn t get stuck in an infinite loop, reasoning, "IfT
is anX<T>
, thenX<T>
is really anX<X<…<T>…>>
." (But constraints obviously don t get resolved like that.)对于执行者来说,在<代码>TImpl之外应指明哪类。 (制约最终将考虑到这一点)。
由于您在各种通用界面之间增加了更多的类型参数和替代关系,因此,这些内容很快就无法管理。