簡體   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