2013-05-22 6 views
6

私はこれらの2つの主要なクラスを持っています。まずFSMSystemクラス:タイプ 'T'はジェネリックタイプまたはメソッドでパラメータ 'T'として使用するために変換可能でなければなりません

public class FSMSystem<T> : MonoBehaviour where T : FSMSystem<T> 
{ 
    private T m_Owner = default(T); 

    protected FSMState<T> currentState; 

    private Dictionary<int, FSMState<T>> m_states; 

    public FSMSystem(T owner) 
    { 
     m_Owner = GameObject.FindObjectOfType(typeof(T)) as T; //owner; 
     m_states = new Dictionary<int, FSMState<T>>(); 
    } 

    protected void AddState(FSMState<T> state) 
    { 
     m_states.Add(state.GetStateID(), state); 
    } 
} 

そして第二のクラス、FSMState:

public abstract class FSMState<T> 
{ 
    public abstract int GetStateID(); 

    public abstract void OnEnter (FSMSystem<T> fsm, FSMState<T> prevState); 
    public abstract void OnUpdate (FSMSystem<T> fsm); 
    public abstract void OnExit (FSMSystem<T> fsm, FSMState<T> nextState); 
} 

それは次のエラーにつながる:

error CS0309: The type ' T ' must be convertible to ' FSMSystem<T> ' in order to use it as parameter ' T ' in the generic type or method ' FSMSystem<T> '

誰かがこれを解決する方法を教えてもらえますか?私はこのような他の多くの記事を参照してくださいが、私は関係を見ていないよ。

+0

このコードはこのエラーを引き起こしますか? –

+1

+1私はdownvotesを理解していないため。 – Medo42

+0

+1 Medo42と同じ理由で。 – user707727

答えて

8

FSMStateTはまた、それ以外の場合はFSMSystemTとして使用することができない、拘束されなければならない - その上に配置された制約(T : FSMSystem<T>)を有します。

あなたがコンパイルエラーの行番号を提供しているだろう場合は、私はなど、それは方法OnEnterを指します疑う

+0

これらの行にエラーが発生しました。 public abstract void OnEnter(FSMSystem fsm、FSMState prevState); 公開抽象空白OnUpdate(FSMSystem fsm); public abstract void OnExit(FSMSystem fsm、FSMState nextState); –

0

それは私に大きな助けです。皆さん、ありがとうございました。私は問題を解決しました。私は 'where'構文について誤解しました。

ここに改訂版があります。

public class FSMSystem<T> : MonoBehaviour where T : FSMSystem<T> 
{ 
    private T m_Owner = default(T); 

    protected FSMState<T> currentState; 

    private Dictionary<int, FSMState<T>> m_states; 

    public FSMSystem() 
    { 
     m_Owner = this as T; 
     m_states = new Dictionary<int, FSMState<T>>(); 
    } 

    protected void AddState(FSMState<T> state) 
    { 
     m_states.Add(state.GetStateID(), state); 
    } 
} 


public abstract class FSMState<T> where T : FSMSystem<T> 
{ 
    public abstract int GetStateID(); 

    public abstract void OnEnter (T fsm, FSMState<T> prevState); 
    public abstract void OnUpdate (T fsm); 
    public abstract void OnExit (T fsm, FSMState<T> nextState); 
} 
+0

Guvanteありがとうございます。私はそれを編集していた..haha –

関連する問題