我有一個簡單的ObjectPool的實現。 ObjectPool包含一堆ObjectPoolObjects。 ObjectPoolObject是一個抽象類,它定義了兩種方法。我正在嘗試將一個對父池的引用添加到ObjectPoolObject類中。我通過使用奇怪的循環模板模式開始工作,但後來我無法從已經派生自ObjectPoolObject的類派生出來。 (即,手榴彈從繼承自ObjectPoolObject的子彈中繼承)...無法將類型`ObjectPool的<T> '爲'ObjectPool的<ObjectPoolObject>'
因此無論如何,父池由ObjectPoolObject持有,如下所示:ObjectPool m_parent ...但我似乎不能設置m_parent = this;在ObjectPool類中...看起來像我應該能夠。我不希望有強制轉換爲對象,然後轉換爲ObjectPool的..好像我應該安全地能夠做到這一點:
public abstract class ObjectPoolObject : MonoBehaviour {
public abstract void ObjectPool_Activate();
public abstract void ObjectPool_Deactivate();
public ObjectPool<ObjectPoolObject> m_pool;
}
public class ObjectPool<T> where T : ObjectPoolObject
{
public ObjectPool(CreateObjectDelegate creationMethod)
{
m_creationMethod = creationMethod;
T objectPoolObject = creationMethod();
// this is the line that gives me error CS0030: Cannot convert type `ObjectPool<T>' to `ObjectPool<ObjectPoolObject>'
objectPoolObject.m_pool = this;
}
}
由於T:ObjectPoolObject我應該能夠做到這一點...
所有我需要的是爲ObjectPoolObject有一個參考它的父ObjectPool的......我怎麼能做到這一點?
編輯:
這是錯誤消息:
error CS0030: Cannot convert type ObjectPool<T> to ObjectPool<ObjectPoolObject>'
但由於T:ObjectPoolObject現在看來似乎應該是能夠做到這一點。它就像它說的「不能將子類轉換爲父類...」T繼承自ObjectPoolObject ...因此T的ObjectPool類似於ObjectPoolObject的子類ObjectPool ... Liskov替換原則應該允許我投射一個T的ObjectPool到ObjectPoolObject的ObjectPool。
例如,我有子彈的ObjectPool的其中子彈從ObjectPoolObject繼承。我應該可以將它轉換爲ObjectPoolObjects的ObjectPool,考慮到ObjectPool中的所有元素都是ObjectPoolObjects .....編輯 - 我開始明白演員的問題是什麼......它很難解釋,哇。
EDIT2 - 定義使用接口的答案「在」對一般類型的關鍵字是這個問題的正確答案。然而!我已經決定這已經越過了「太複雜」的行,並決定從ObjectPoolObject中刪除m_pool字段。當你從一個對象池中獲取一個對象時,它就由你來記錄它來自哪個池並將其正確放回。 m_pool字段只是簡單地弄髒了我的系統,對我來說太合理了。
去除ObjectPool的的Genericism完全也是一個實用的解決方案,但它需要我投每個ObjectPool.Get調用的返回結果,我決定,我不想,要麼。
沒有,只是因爲T是(或從繼承)ObjectpoolObject並不意味着ObjectPool的是(或從繼承)ObjectPool的 –
Shazi
這是ObjectPool的其中T:ObjectPoolObject .... 我應該能夠將其轉換爲ObjectPool ... 我認爲你有句子的第二部分倒退。我是T是一個ObjectPoolObject ... –
我不這麼認爲?您正在嘗試使用ObjectPool(其中T是或從ObjectPoolObject繼承的變量)分配m_pool(它是ObjectPool )。 問題不在於T是從ObjectPoolObject繼承的,但是ObjectPool ObjectPoolObject繼承自ObjectPool (因爲那就是你試圖分配m_pool時所假設的) –
Shazi