我开始和我的朋友在C#的XNA游戏库中制作一些小游戏,然后我创建了一个Player
类,这个类太大而无法发布,但有一个受保护的变量:
protected int moveSpeed = 3; (which affects how fast Player can move)
我有一个班级孩子,Fighter
,因为游戏将基于不同的战斗类型,我希望Fighter继承玩家的属性(包括变量)。例如:moveSpeed
,但每当我尝试为Fight分配一个特定的值时,它就不会让我公开声明moveSpeed = 2;
,例如并说:moveSpeed是FIELD
,但用作TYPE
。 C#
是否没有直接变量访问权限,或者仅适用于函数/方法。
PS:我从未在C#中使用继承,只有java。感谢任何帮助,谢谢。
答案 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; } }
}