0

我开始和我的朋友在 C# 的 XNA 游戏库中制作一些小游戏,并制作了一个Player类,它太大而无法发布,但有一个小受保护变量:

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

我有一个子类Fighter,因为游戏将基于不同的战斗类型,我希望 Fighter 继承 Player 的属性(包括变量)。例如:moveSpeed,但是每当我尝试为 Fighter 分配一个特定的 moveSpeed 值时,它不会让我公开声明moveSpeed = 2;,例如并说: moveSpeed 是 a FIELD,但用作 a TYPE。没有C#直接的变量访问,或者仅适用于函数/方法。

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设为常量(即无法在运行时更改)?我这样说是因为听起来你想要一个速度为 2 的基本Player,但想要创建一个能够以更快速度移动的Fighter派生类,但这些速度对于每种类型的播放器。

你不能有一个虚拟常量,但你可以有一个只有吸气剂的虚拟属性:

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 回答
0

您将 MoveSpeed 声明为一个protected字段。所以你可以在 Player 的派生类中访问它。但是你不能在那之外访问它。如果你有一个Property,你也可以在派生类之外访问它。当您创建一个自动实现的属性时,会在后台创建一个 Getter 和 Setter 方法来设置和检索备份字段的值(由 CLR 创建)。

假设你的类结构是这样的

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 是 FIELD,但用作 TYPE

通常,当您moveSpeed = 2;在类中编写赋值语句(如 )时会发生这种情况,而它应该在方法或构造函数中。

错误消息有些令人困惑,但它是有道理的:类中的语句通常以类型 ( int bla = 123;) 开头,而在这种情况下,第一个单词是变量 ( moveSpeed) 的名称。

只需移动moveSpeed = 2;到您的构造函数(或方法或属性)即可解决问题。

于 2012-04-18T21:31:54.840 回答