1

我的班级设计有问题。

我的游戏对象有核心类。在绘图时,我需要从对象中检索位置。不幸的是,对象被视为它的基类型,因此该位置不是从派生类中检索的,而是从其父类中检索的。将字段定义为虚拟可以解决我的问题,但这是不可能的:(。如何设计类模式来避免这个问题?

正在发生的事情的简单示例:

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
4

2 回答 2

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};
    }
}

这并不完全相同,因为您没有用自己的基类字段隐藏基类字段,但它会正确初始化它,以便您可以按照示例建议使用它。

于 2009-04-06T16:01:17.993 回答
1
  • 关键字表示隐藏基类中定义的new同名符号。
  • public字段在 C# 中被视为“气味”

override解决方法:在派生类中使用properties和property:

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}) {
    }
}
于 2009-04-06T16:04:09.280 回答