我对Generic Types相当新,但仍尝试为Unity编写一个通用的Singleton行为,从这个声明开始:
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>
派生,但显然它并非如此。
我出错了什么? 实际上是否有办法强制实施这种约束?
答案 0 :(得分:1)
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-bounded多态的要点是方法链,你可以在Fraud
上尽可能地链接Example
上的方法。它可能不会做同样的事情,但如果你创建了一个忽略每次调用IDictionary
的新Add
,那么你会遇到同样的问题:你可以&# 39;使用类型系统强制执行所有操作(除非你是Coq);你不能总是阻止外部实体做他们不应该做的事情。