多态性问题 - 虚拟领域? (C#)

时间:2009-04-06 15:57:55

标签: c# xna polymorphism

我的班级设计有问题。

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

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

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

2 个答案:

答案 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}) {
    }
}