おはよう、Unity3D EventManager:インタフェースから派生した汎用タイプのイベントを持つ辞書
現在、私はUnity PorjectのEventSystemに取り組んでいます。 したがってUnityEvent(私が聞いたように昨年改善された)を利用したいと思います。
EventManagerは可能な限り一般的なものでなければならず、イベントをEventTypeで登録しなければなりません。したがって、UnityEventから派生した汎用のBaseEventを作成しました。型はEventDataオブジェクトを定義するためのインタフェースであるIEventDataでなければならない。
public class BaseEvent<T> : UnityEvent<T> where T : IEventData {}
public interface IEventData {}
public struct SomeEventData : IEventData
{
public readonly float someFloat;
public readonly bool someBool;
public SomeEventData(float param1, bool param2)
{
someFloat = param1;
someBool = param2;
}
}
ここで私はEventmanagerに次の問題があります。 EventManagerはBaseEventで辞書を保持しているので、AddListenerのような汎用メソッドからアクセスしようとするとエラーが発生します。
public class EventManager {
private Dictionary<System.Type, BaseEvent<IEventData>> m_events;
private static EventManager m_instance;
public static EventManager Instance {
get {
if (m_instance == null) {
m_instance = new EventManager();
}
return m_instance;
}
}
public static void AddListener<T>(BaseEvent<T> listener) where T : IEventData {
BaseEvent<T> tempEvent;
if (Instance.m_events.TryGetValue(typeof(T), out tempEvent)) {
tempEvent.AddListener(listener);
}
else {
tempEvent = new BaseEvent<T>();
tempEvent.AddListener(listener);
Instance.m_events.Add(typeof(T), tempEvent);
}
}
エラーは明らかです。 TのBaseEventからIEventDataのBaseEventを変換することはできません。しかし、私はそれを動作させるためにコードをどのように変更しなければならないのか分かりません。私は "T:IEventData"が問題を修正すると思ったが、Tは派生クラスであるかもしれないので、そうは思わない。
私の質問は 一般的なBaseEventを追加することは可能ですか?
事前に感謝します。
も参照[この質問と回答](http://stackoverflow.com/questions/31572956/understanding-generics-and-func-arguments)で説明されています – Draco18s