[英]How do I pass the reference of an instance from a class with a constrained parameter type, to an instance of that constraint type?
假设我有这两个类:
public abstract class ASpawnedObject {}
public abstract class ASpawner<T> where T : ASpawnedObject {}
ASpawner
class 创建了一些ASpawnedObject
实例。 我希望它将自己传递给ASpawnedObject
构造函数并将其引用作为成员变量:
public abstract class ASpawnedObject {}
{
ASpawner<ASpawnedObject> spawner;
public void Init(ASpawner<ASpawnedObject> spawner)
{
this.spawner = spawner;
}
}
public abstract class ASpawner<T> where T : ASpawnedObject
{
public void Spawn()
{
T spawnedObject = System.Activator.CreateInstance<T>();
spawnedObject.Init(this);
}
}
但是: spawnedObject.Init(this)
导致ASpawner
中的转换错误。 即使有类型约束,它也无法将ASpawner<T>
转换为ASpawner<ASpawnedObject>
。 我不明白。 它不遵循多态性原则吗?
本次测试 class 编译运行无任何异常
[TestClass]
public class Test
{
[TestMethod]
public void X()
{
var ghostSpawner = new GhostSpawner();
ghostSpawner.Spawn();
}
}
您需要做的是根据您生成的 object 来限制您的生成器和生成的 object。 是的,就后者而言,这意味着:
public abstract class ASpawnedObject<T> where T : ASpawnedObject<T>
{
ASpawner<T> spawner;
public void Init(ASpawner<T> spawner) => this.spawner = spawner;
}
public abstract class ASpawner<T> where T : ASpawnedObject<T>
{
public void Spawn()
{
T spawnedObject = Activator.CreateInstance<T>();
spawnedObject.Init(this);
}
}
如您所见,这意味着ASpawnedObject
基础 class 必须是通用的。 然后,您可以创建使测试通过的非泛型具体类。
public class GhostSpawner : ASpawner<Ghost>
{}
public class Ghost : ASpawnedObject<Ghost>
{}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.