我正在阅读有关原型模式的德语维基百科文章。示例部分包含使用以下内容的通用C#实现:
abstract class Prototype<T> where T : Prototype<T> { ... }
...
class ConcretePrototype : Prototype<ConcretePrototype> { ... }
这是如何运作的?如何将T限制为相同的泛型类?您如何使用类使用自身从通用类型派生?
我不是在编写C#,但是这似乎很有趣。
资料来源:原型模式
ProtoType<T>
有一个Clone
方法,该方法以类型安全的方式返回具体的原型,因此T
必须将其定义为类型参数。由于类型T
只能是从派生的类Prototype
,因此该行:
abstract class Prototype<T> where T : Prototype<T> { ... }
必须限制T
为的子类Prototype
。由于Prototype
是通用的,Prototype<T>
必须在约束中指定。
从理论上讲,的声明ConcretePrototype
应该只是:
class ConcretePrototype : Prototype<> { ... }
(或类似语法)。但是C#编译器不支持以这种方式推断类型参数。如果您输入以下内容:
class ConcretePrototype : Prototype<string> { ... }
Prototype<ConcretePrototype>
由于方式Prototype
的限制,您将得到一个编译错误,因为它必须知道,这是必须的。编译器需要对此进行显式声明,因此:
class ConcretePrototype : Prototype<ConcretePrototype> { ... }
我注意到Damien_The_Unbeliever击败了我以寻找参考,但是无论如何,我都会提到Eric Lippert在该主题上的出色文章。绝对值得一读以帮助理解它,并理解为什么它会引起问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句