我有一个“基础”类,其中包含以下属性:
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,但它使用字节而不是浮点数。答案 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。