私は単純なObjectPoolを実装しています。 ObjectPoolは、ObjectPoolObjectのスタックを保持します。 ObjectPoolObjectは、2つのメソッドを定義する抽象クラスです。親プールへの参照をObjectPoolObjectクラスに追加しようとしています。私は不思議な繰り返しのテンプレートパターンを使用して作業する必要がありますが、私はすでにObjectPoolObjectから派生したクラスから派生することができませんでした。 (つまり、手榴弾はObjectPoolObjectから継承した弾丸を継承します)...`ObjectPool 'を` ObjectPool <ObjectPoolObject>'に変換できません
とにかく、親プールはObjectPoolObjectによって保持されています。ObjectPool m_parent ...しかし、私はm_parent = thisを設定することはできません。 ObjectPoolクラスで...私は間違いなくできるはずです。 T以来
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;
}
}
:私は、私は安全にこれを行うことができるはずのようにそれはそう...オブジェクト、その後ObjectPoolにキャストするキャストする必要がありますする必要はいけないObjectPoolObject私はこれを行うことができるはず...
私が必要とするのは、ObjectPoolObjectがその親ObjectPoolへの参照を持つことです。これをどのように達成できますか?
EDIT:
error CS0030: Cannot convert type ObjectPool<T> to ObjectPool<ObjectPoolObject>'
が、T以降:
これはエラーメッセージですObjectPoolObjectこれを行うことができるはずのようにそれはそう。そのような "子クラスを親クラスに変換することはできません..." TはObjectPoolObjectから継承...したがって、TのObjectPoolは、ObjectPoolObjectの子クラスObjectPoolに似ています... Liskov置換原則は、 TのObjectPoolからObjectPoolObjectのObjectPoolに移動します。
たとえば、BulletがObjectPoolObjectから継承するBulletのObjectPoolがあります。 ObjectPoolObjectsのすべての要素がObjectPoolObjectsであることを考慮して、ObjectPoolObjectsのObjectPoolにキャストする必要があります。
EDIT - キャストの問題が何であるか理解し始めています....説明するのがとても難しい、うわー。
EDIT2 - ジェネリック型の "in"キーワードを使用してインターフェイスを定義する答えは、この問題に対する正解です。しかしながら!私はこれが "複雑すぎる"という行を超え、ObjectPoolObjectからm_poolフィールドを削除することに決めました。オブジェクトプールからオブジェクトを取得するときは、それがどのプールから来たのかを記録し、適切に戻すことができます。 m_poolフィールドは私のシステムをあまりにも汚くしすぎて、それを含めて正当化することができませんでした。
ObjectPoolからGenericismを完全に削除することも機能的な解決策ですが、すべてのObjectPool.Get呼び出しの戻り値をキャストする必要があります。
いいえ、Tは、である(又はから継承)ObjectpoolObjectこれはここで、T ObjectPoolあるObjectPoolが ObjectPool –
Shazi
(またはから継承する)ことを意味するものではないという理由だけで:ObjectPoolObject .... これをObjectPoolにキャストすることができるはずです... 私はあなたの文の第2部分が後方にあると思います。私はTがObjectPoolObjectです... –
私はそうは思わない? ObjectPoolであるm_poolに、ObjectPool という変数を割り当てようとしています(TはObjectPoolObjectから継承しています)。 また、TはObjectPoolObjectから継承していませんが、ObjectPool はObjectPoolから継承しています(m_poolを割り当てようとしているので仮定しているためです) –
Shazi