子类和变量继承

时间:2012-04-18 21:22:36

标签: c#

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

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

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

PS:我从未在C#中使用继承,只有java。感谢任何帮助,谢谢。

5 个答案:

答案 0 :(得分: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
  }
}

答案 1 :(得分:0)

在描述中,您的代码应该如下所示:

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

  public class Fighter : Player 
  {
  }

声明MoveSpeed类似于基类的自动属性(避免声明像public这样的字段并直接访问,但是使用属性)

答案 2 :(得分: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

答案 3 :(得分:0)

  

每当我尝试为Fight分配一个特定的值时,它就不会让我公开声明moveSpeed = 2;,例如并说:moveSpeed是一个FIELD,但用作TYPE

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

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

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

答案 4 :(得分:0)

鉴于你的描述,我觉得你需要 moveSpeed 成为常量(即无法在运行时改变)?我这样说是因为听起来你想要一个速度为2的基础播放器,但是想要创建一个能够移动到 Fighter 的派生类更快的速度,但这些速度对于每种类型的玩家都是固定的。

您不能拥有虚拟const,但是您可以拥有一个只有getter的虚拟属性:

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

public class Fighter : Player
{
    protected override int MoveSpeed { get { return 3; } }
}