我的班级设计有问题。
我的游戏对象有核心课程。绘图时我需要从对象中检索位置。不幸的是,对象被视为它的基类型,因此不会从派生类中检索位置,而是从它的父级检索位置。将字段定义为虚拟可以解决我的问题,但这是不可能的:(。如何设计类模式以避免此问题?
正在发生的事情的简单例子:
class BaseClass { public Vector2 position = new Vector2(){X=0,Y=0}; }
class Class:BaseClass { public new Vector2 position = new Vector2(){X=10,Y=10}; }
BaseClass c = new Class();
// c.position.X is now 0
答案 0 :(得分:3)
您可以重做此操作以使用虚拟属性而不是字段。这将正确处理事情。
如果出于某种原因无法使用属性,您还可以按如下方式重新构造构造函数:
class BaseClass
{
public Vector2 position = new Vector2(){X=0,Y=0};
}
class Class:BaseClass
{
public Class()
{
this.position = new Vector2(){X=10,Y=10};
}
}
这不完全相同,因为您没有使用自己的基类字段隐藏它,但它会正确初始化它,以便您可以像示例所示那样使用它。
答案 1 :(得分:1)
new
关键字表示隐藏基类中定义的同名符号。public
字段在C#中被视为“气味”解决方案:在派生类中使用属性和override
属性:
class BaseClass {
public virtual Vector2 Position {
get { return new Vector2(){X=0,Y=0}; }
}
}
class Class : BaseClass {
public override Vector2 Position {
get { return new Vector2(){X=10,Y=10}; }
}
}
您可以使用支持字段来存储Vector2
。
或者,您可以让基类处理位置并传递初始值:
class BaseClass {
private Vector2 _position;
public BaseClass() {
_position = new Vector2(){X=0,Y=0};
}
protected BaseClass(Vector2 initialPosition) {
_position = initialPosition;
}
public Vector2 Position {
get { return _position; }
set { _position = value; }
}
}
class Class : BaseClass {
public Class() : base(new Vector2(){X=10,Y=10}) {
}
}