c# - 如何将实例的引用从具有约束参数类型的类传递给该约束类型的实例?
问题描述
假设我有这两个类:
public abstract class ASpawnedObject {}
public abstract class ASpawner<T> where T : ASpawnedObject {}
该类ASpawner
创建了一些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>
我不明白。它不遵循多态性原则吗?
解决方案
这个测试类编译运行没有任何异常
[TestClass]
public class Test
{
[TestMethod]
public void X()
{
var ghostSpawner = new GhostSpawner();
ghostSpawner.Spawn();
}
}
您需要做的是根据您的生成对象来约束您的生成器和生成的对象。是的,就后者而言,这意味着:
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
基类必须是通用的。然后,您可以创建使测试通过的非泛型具体类。
public class GhostSpawner : ASpawner<Ghost>
{}
public class Ghost : ASpawnedObject<Ghost>
{}
推荐阅读
- mysql - REGEXP 匹配包含 + 和空格的单词列表
- c - 这段代码如何在不使用 sizeof() 的情况下确定数组大小?
- quicksort - 如果数组已经排序,快速排序会保留原始顺序吗?
- python - 什么是零膨胀层以及如何在 pytorch 上实现它?
- php - PHP的文件锁定
- tensorflow - 是否可以在不使用 Estimator API 的情况下在 TPU 上运行 python tensorflow 代码?
- javascript - Mapbox 没有在所有页面上加载?
- c++ - 在浮点比较中选择 ULP 值
- git - Git:恢复合并提交,但保存保存后续提交(删除合并提交后)
- java - 如何将环境变量传递给jar文件?