关于继承和属性的问题

时间:2011-09-10 19:33:22

标签: c# inheritance properties

我有一个“基础”类,其中包含以下属性:

    public virtual Vector3b SIZE { get { return new Vector3b(16, 16, 16); } }

    public virtual Vector3b MAX
    {
        get { return new Vector3b(
                    (byte)(this.SIZE.X - 1), 
                    (byte)(this.SIZE.Y - 1), 
                    (byte)(this.SIZE.Z - 1)); 
            }
    }

现在,如果我在我的类中重写继承自基类的SIZE属性,那么MAX会从基类还是从继承类计算SIZE(或者它应该只是没有它的SIZE)?

编辑:忘记提及,Vector3b只是基本的Vector3,但它使用字节而不是浮点数。

4 个答案:

答案 0 :(得分:6)

根据定义,虚拟属性或方法根据接收方的运行时类型调度方法。在您的示例中,如果运行时类型是派生类,则调用派生属性。

答案 1 :(得分:0)

如果覆盖虚拟属性,则继承的类将使用继承类中的所有内容。

答案 2 :(得分:0)

如果MAX引用的运行时类型是派生类型,

SIZE将使用派生类this。根据对象的 runtime 类型,它被称为虚拟方法和属性的动态调度

class X
{

   public virtual Vector3b SIZE { get { return new Vector3b(16, 16, 16); } }

    public virtual Vector3b MAX
    {
        get { return new Vector3b(
                    (byte)(this.SIZE.X - 1), 
                    (byte)(this.SIZE.Y - 1), 
                    (byte)(this.SIZE.Z - 1)); 
            }
    }
}

class Y : X
{
    public virtual Vector3b SIZE { get { return new Vector3b(26, 26, 26); } }
}

 X x = new X();
 var xmax = x.MAX ;// MAX uses X's SIZE

 Y y = new Y();
 var ymax = y.MAX ;// MAX uses Y's SIZE

答案 3 :(得分:-1)

您的派生类将使用重写的SIZE。