2017-11-28 3 views
0

私はUnity3Dでの状態パターンを(私はUnityへのSUPER新たなんだ)をテストするには、次の3つのスクリプトを作成し、予期しない結果を得た:Unity3D:入れ替える子クラスのインスタンス(状態パターン)

BaseState

public class BaseState { 
    public void Enter() 
    { 
     Debug.Log("Entered BaseState"); 
    } 
} 

IntroState

public class IntroState : BaseState { 
    public void Enter() 
    { 
     Debug.Log("Entered IntroState"); 
    } 
} 

StateController

public class StateController : MonoBehavior { 
    private BaseState state; 

    void Start() 
    { 
     state = new IntroState(); 
     state.Enter(); 
    } 
} 

これをGameObjectに添付すると、コンソールに「Entered IntroState」が表示されます。代わりに、 "Entered BaseState"が表示されます。

私は間違っていますか?

答えて

1

サブクラスで同じシグネチャを使用してメソッドを定義している場合、メソッドを「隠している」。 あなたがpublic void virtualとしてBaseState.Enterをマークし、IntroState.Enteroverrideを追加する必要がありますので、それは何が起こっているpublic override void Enter()

なりすることで、BaseStateタイプでstate変数を持っているということです。 state = new IntroState();と書くと、暗黙のアップキャスト(google it up)を行っています。私はまた、あなたが「ステートレス」と呼ばれるライブラリおよび詳細については、この答えをチェックアウトをお勧めします

「BaseStateを入力した」GETなぜその後あなたがBaseStateオブジェクト上Enterメソッドを呼び出している、thatsの

Overriding vs method hiding

関連する問題