繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM