[英]Polymorphism issue - virtual fields? (C#)
我有课堂设计的问题。
我的游戏对象有核心课程。 绘图时我需要从对象中检索位置。 不幸的是,对象被视为它的基类型,因此不会从派生类中检索位置,而是从它的父级检索位置。 将字段定义为虚拟可以解决我的问题,但这是不可能的:(。如何设计类模式以避免此问题?
发生了什么的简单例子:
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
您可以重做此操作以使用虚拟属性而不是字段。 这将正确处理事情。
如果无论出于何种原因无法使用属性,您还可以按如下方式修改构造函数:
class BaseClass
{
public Vector2 position = new Vector2(){X=0,Y=0};
}
class Class:BaseClass
{
public Class()
{
this.position = new Vector2(){X=10,Y=10};
}
}
这并不完全相同,因为您没有使用自己的基类字段隐藏它,但它会正确初始化它,以便您可以像示例所示使用它。
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}) {
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.