0

私はクラス Pawn を持っています。これはゲーム内のすべての「キャラクター」の基本クラスであり、健康などのプロパティを持ち、移動したり、死んだり、話したりすることができます。これを拡張するクラスの 1 つが「Boy」クラスです。「Boy」クラスは、このゲームでプレイヤーが操作するキャラクターです。

キャラクターの「状態」を制御するために、状態クラスが作成されます。これらには、onEnterState、onStateTick、onLeaveState などのメソッドがあります。状態は、しゃがむ、歩く、ジャンプすることを表すために使用される場合があり、「keyPressed」「<-」などのメッセージを送信して、選択したとおりに処理または無視します。

私の問題は、私の基本「状態」クラスに次のようなメソッドがあることです。

function onEnter ( pawn:Pawn ) :void;
function onLeave ( pawn:Pawn ) :void;       
function onGameTick ( pawn:Pawn ) :void;        
function onAnimEnd ( pawn:Pawn ) :void;

ご覧のとおり、これは実際にはインターフェイスですが、ActionScript3 が抽象クラスをあまり好まないことが明らかになるまで、最初に基本クラスを試しました。

とにかく、クラス「BoyJumpState」は明らかにこのクラス/インターフェイスを拡張/実装して、対話用のパブリックメソッドが存在することを確認する必要がありますが、これは、ActionScript では拡張できないという事実によって妨げられています。 :

public override function onEnter ( boy:Boy) :void { trace("Hey"); }

これは設計図と一致しない (つまり、ポーンを受け入れない) ため、コンパイル時に拒否されます。ただし、そのクラスに固有のメソッドをメソッド本体で利用する必要があるため、Boy を受け入れるにはそれが必要です。

元のインターフェイスが問題であり、代わりにパラメーターがポーンを拡張する必要があり、実際にはポーンである必要はないことを指定する必要があると考えていますが、ActionScript でこれを実装する方法は見当たりません。

...または、完全に間違った方向に進んでいる可能性もあります。その場合は、アドバイスをいただければ幸いです。

継承を行うことができなかったことに気づきましたが、私が作成しているゲームは、私が慣れ親しんでいるものよりも大規模であるため、オブジェクト指向プログラミングの実践に近いものです。しかし、私は自分の快適な言語 (Java) から離れてしまい、ここで何をすべきかについて本当に自分を超えています。

どんな助けでも感謝します、ありがとう。

4

5 に答える 5

1

共変型に一致させるために、オーバーライドされたメソッドのシグネチャをオーバーライドする必要はありません。ただし、サブクラスのメソッドに特定の型が必要な場合は、オーバーライドされたメソッドをチェック/キャストする必要があります。

于 2012-06-15T18:44:24.537 に答える
1

AS3 でインターフェイスを実装する場合、署名は正確に一致する必要があります。

次のように、実行時に型を確認できます。

public override function onEnter ( pawn:Pawn ) :void
{
    var boy:Boy = pawn as Boy;
    if(boy)
    {
        trace("Hey");
    }
}
于 2012-06-15T19:55:13.890 に答える
0

あなたの例のように、各具象クラスで必要なタイプにアップキャストすることで、この問題にアプローチすると思います。

public override function onEnter ( boy:Boy) :void { trace("Hey"); }

これを次のように変更します。

public override function onEnter ( pawn:Pawn) :void 
{  
     // do something all pawns can do!
     pawn.move();

     // do something only a boy can do!
     Boy(pawn).doSomething();
}

私は間違いなく基本クラスを使用します。確かに、Actionscript 3 は Java と同じように抽象クラスをサポートしていませんが、だからと言って基本クラスを作成してメソッドをオーバーライドすることを止めるわけではありません。とにかくインターフェイスへの基本クラス。

于 2012-06-16T18:35:04.333 に答える
0
public override function onEnter ( pawn:Pawn ) :void
{
  if(pawn is Boy)
  {
    //do something else
  }
  else
  {
    //do the normal
    super.onEnter(pawn);
  }
}
于 2012-06-16T10:08:14.110 に答える
0

Boyとによって実装されるインターフェースが必要だと思いPawnますIPlayer

public class Boy extends Sprite implements IPlayer

public class Pawn extends Sprite implements IPlayer

IPlayer一致するすべてのパブリック関数とゲッター/セッターを持つ名前付きインターフェイスを作成します。

package
{
   public interface IPlayer
   {
      function destroy():void;
      function get x():Number;
      function get y():Number;
   }
 }

これで、このように関数を更新できます

function onEnter ( player:IPlayer ) :void;
function onLeave ( player:IPlayer ) :void;       
function onGameTick ( player:IPlayer ) :void;        
function onAnimEnd ( player:IPlayer ) :void;

クラスを拡張する場合、パラメーターの型をオーバーライドしても問題はありません。これは、両方のクラスが拡張するインターフェイスに型が少し抽象化されているためです。

于 2012-06-17T17:08:06.253 に答える