繁体   English   中英

如何将具有约束参数类型的 class 的实例引用传递给该约束类型的实例?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM