버그 해결을 위한 모든 질문을 던져
0 votes
122 views
public interface IPoolObjectBase
{ }

public class ObjectFactory : MonoBehaviour
{
    private static Dictionary<string, ObjectPool<IPoolObjectBase>> m_TotalPoolDic = new Dictionary<string, ObjectPool<IPoolObjectBase>>();
    private static SpriteAtlas UIAtlas; 

    public static void CreateAllPool()
    {
        Release();
        CreatePool<SpeechBubble>(5, "UI/SpeechBubble");
    }

    public static void CreatePool<T>(int count, string path) where T : IPoolObjectBase
    {
        var pool = new ObjectPool<T>(count, () =>
        {
            T poolObj = ResourcesManager.Instantiate<T>(path);
            return poolObj;
        }
        , (T pushObj) => { }, (T popObj) => { });

        m_TotalPoolDic[typeof(T).Name] = pool;
    }

    public static void Release()
    {
        m_TotalPoolDic.Clear();
    }
}

오브젝트 풀링을 하려고 CreatePool메서드를 작성하는데

m_TotalPoolDic[typeof(T).Name] = pool;

여기서 암시적 변환이 안된다고 에러가 뜹니다.

m_TotalPoolDic은 밸류로 ObjectPool<IPoolObjectBase>를 가지고 있는 컬렉션, ObjectPool은 where T : IPoolObjectBase로 IPoolObjectBase를 구현한 클래스만 받는 제네릭 클래스인데

m_TotalPoolDic에 풀을 만들어 넣어주기위해 CreatePool에도 where T : IPoolObjectBase 형식제한을 걸어서 생성한 풀을 컬렉션에 넣어주려고 하니 암시적 변환이 안된다고 합니다.

제 생각으로는 결국 T는 IPoolObjectBase를 구현할수 밖에 없으니 암시적으로도 되야 하는데, 이것이 안된다고 하면 어떤 다른 방법이 있을까요?

 

폐쇄 기록: as ObjectPool<IPoolObjectBase>로 명시적으로 캐스팅해서 컴파일 에러는 해결했습니다. 암시적이 변환이 안되는 이유는 확인을 못했네요
asked (2 point)
closed , 122 views
일반화 타입에서 특수화 타입으로 대입이 되는 것이므로 암시적 형변환이 안 되는 것이 맞습니다. 그런 경우 암시적 형변환을 이끌어내려면 ObjectPool<T> 타입에 다음과 같은 식의 연산자 재정의 메서드를 넣어두어야 합니다.

public static implicit operator ObjectPool<IPoolObjectBase>(ObjectPool<T> obj)

{
    return (ObjectPool<IPoolObjectBase>)obj;
}

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

186 질문
289 answers
314 댓글
307 users