使用self作为泛型类型约束

时间:2017-10-27 00:04:05

标签: c# generics unity3d singleton

我对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>应足以迫使FraudSingleton<Fraud>派生,但显然它并非如此。

我出错了什么? 实际上是否有办法强制实施这种约束?

1 个答案:

答案 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);你不能总是阻止外部实体做他们不应该做的事情。