2013-05-22 54 views
6

我有這兩個主要類。首先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); public abstract void 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。我正在編輯那個..哈哈 –

相關問題