0

私は友人と C# の XNA ゲーム ライブラリでいくつかの小さなゲームを作成し始めましPlayerた。投稿するには大きすぎますが、少し保護された変数を持つクラスを作成しました。

protected int moveSpeed = 3; (which affects how fast Player can move)

Fighterゲームはさまざまな戦闘タイプに基づいているため、クラスの子があり、ファイターにプレーヤーのプロパティ (変数を含む) を継承させたいと考えています。例:moveSpeedですが、Fighter に moveSpeed の特定の値を割り当てようとするとmoveSpeed = 2;、 を公然と宣言することはできませFIELDTYPEC#変数に直接アクセスできないか、関数/メソッドにのみ適用されます。

PS: C# で継承をいじったことはありません。Java だけです。どんな助けでも大歓迎です、そしてありがとう。

4

5 に答える 5

0

変数を再宣言するのではなく、値を変更するだけです。これは、コンストラクターで行うのが最適です。

public class SomeTypeOfPlayer : Player
{
  //protected int moveSpeed = 2; DON'T DO THIS! It would be 
  //re-defining it, not setting the existing field.

  public SomeTypeOfPlayer()
  {
    moveSpeed = 2;  //Do this
  }
}
于 2012-04-18T21:26:24.730 に答える
0

説明を見ると、コード次のようになります。

  public class Player
  {
       public double MoveSpeed {get;set}
  }

  public class Fighter : Player 
  {
  }

MoveSpeed基本クラスの自動プロパティのように宣言します(のようなフィールドを宣言して直接アクセスすることは避けますpublicが、これにはプロパティを使用します)

于 2012-04-18T21:28:29.190 に答える
0

MoveSpeed をprotectedフィールドとして宣言しました。したがって、Player の派生クラスでこれにアクセスできます。しかし、それ以外にアクセスすることはできません。がある場合はProperty、派生クラスの外でもアクセスできます。自動実装プロパティを作成すると、バックアップ フィールド (CLR によって作成された) の値を設定および取得するために、Getter メソッドと Setter メソッドがバックグラウンドで作成されます。

あなたのクラス構造がこのようなものであると仮定します

public class Player
{
 public int MoveSpeed { set;get;}    
}

public class Fighter : Player
{
 public int FigherTypeId { set;get;}
}

このように Player MoveSpeed を設定できるはずです

Fighter objFighter=new Fighter();
objFighter.MoveSpeed=35;

フィールドをそのままにしたい場合はProtected、それを行い、子クラスのコンストラクターでプロパティ値を設定できます

public class Player
{
 protected int MoveSpeed =3;

}
public class Fighter : Player
{
    public int FigherTypeId { set; get; }

    public Fighter(int _moveSpeed)
    {
        MoveSpeed = _moveSpeed;
    }
}

このような子クラスオブジェクトを作成します

Fighter objFighter = new Fighter(44); 

http://blogs.msdn.com/b/ericlippert/archive/2005/11/09/491031.aspx

于 2012-04-18T21:29:36.867 に答える
0

Fighter に moveSpeed の特定の値を割り当てようとするたびに、moveSpeed = 2; を公然と宣言することはできません。たとえば、次のように表示されます。

moveSpeed = 2;通常、これは、メソッドまたはコンストラクター内にある必要があるのに、クラス内に代入ステートメント ( など) を記述したときに発生します。

エラー メッセージはやや紛らわしいですが、理にかなっています。通常、クラス内のステートメントは型 ( int bla = 123;) で始まりますが、この場合、最初の単語は変数の名前 ( moveSpeed) です。

moveSpeed = 2;コンストラクター (またはメソッド、またはプロパティ) に移動するだけで、問題は解決します。

于 2012-04-18T21:31:54.840 に答える
0

あなたの説明を考えると、moveSpeedを定数にする必要があるように思えます(つまり、実行時に変更できない)?これは、速度が 2 のベースPlayerが必要であるが、より速い速度で移動できるFighterの派生クラスを作成したいように聞こえるためです。ただし、これらの速度は各タイプで固定されています。プレーヤー。

仮想 const を持つことはできませんが、ゲッターのみを持つ仮想プロパティを持つことはできます。

public virtual class Player
{
    protected virtual int MoveSpeed { get { return 2; } }
}

public class Fighter : Player
{
    protected override int MoveSpeed { get { return 3; } }
}
于 2012-04-18T22:12:40.557 に答える