2013-05-22 7 views
6

Mam te dwie główne klasy. Pierwsza klasa FSMSystem:Typ "T" musi być wymienny, aby można go było użyć jako parametru "T" w typie ogólnym lub metodzie

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); 
    } 
} 

A druga klasa, 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); 
} 

To prowadzi do następującego błędu:

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> '

Czy ktoś może mi powiedzieć jak rozwiązać ten problem? Widzę wiele innych postów podobnych do tego, ale nie widzę związku.

+0

Który kod prowadzi do tego błędu? –

+1

+1, ponieważ nie rozumiem spadków. – Medo42

+0

+1 Z tego samego powodu co Medo42. – user707727

Odpowiedz

8

T z FSMState musi być także ograniczany, poza tym, że nie mogą być stosowane jako T z FSMSystem - który ma ograniczenia umieszczonego na nim (T : FSMSystem<T>).

Jeżeli podałeś numer linii błędu kompilatora, podejrzewam, że to wskazywać na metodach OnEnter itp

+0

błędy wystąpiły w tych liniach. Publiczne streszczenie pustki OnEnter (FSMSystem fsm, FSMState prevState); publiczne streszczenie void OnUpdate (FSMSystem fsm); Publiczne streszczenie pustki OnExit (FSMSystem fsm, FSMState nextState); –

0

To duża pomoc dla mnie. Dziękuję wam wszystkim. Rozwiązałem problem. Źle zrozumiałem składnię "gdzie".

Oto poprawiona wersja, która działa.

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

dziękuję Guvante. Edytowałem to ... haha –

Powiązane problemy