我对通用类型相当陌生,但仍然尝试为 Unity 编写通用单例行为,从以下声明开始:
public abstract class Singleton<T> : MonoBehaviour where T : Singleton<T>{}
然后通过声明两个子类立即对其进行测试:
public class Example : Singleton<Example> {}
public class Fraud : Singleton<Example> {}
我预计会出现错误,但这实际上已编译。
据我了解,where T : Singleton<T>
应该足以强制Fraud
从 派生Singleton<Fraud>
,但显然不是。
我做错了什么?
实际上有没有办法强制执行这样的约束?
public class Example : Singleton<Example> {}
上的约束Singleton<T>
是T : Singleton<T>
。替换T := Example
,您就会得到约束Example : Singleton<Example>
,它之所以成立,是因为我们就是这样声明的Example
。没有问题。
public class Fraud : Singleton<Example> {}
上的约束Singleton<T>
是T : Singleton<T>
。替换T := Example
,您就会得到约束Example : Singleton<Example>
,它之所以成立,是因为我们就是这样声明的Example
。没有问题。
有没有理由Fraud
以不有效,所以它是有效的。毕竟,F 有界多态性的重点是方法链,你可以Fraud
像在 上一样链接方法Example
。它可能不会做同样的事情,但如果你创建一个 newIDictionary
忽略每一次对 的调用,你会遇到同样的问题Add
:你不能使用类型系统来强制执行所有事情(除非你是 Coq);你不能总是阻止外部实体做他们不应该做的事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句