我想知道.NET 值类型为什么不支持继承(忽略接口实现)是否有任何技术原因......我乍一看想不出为什么值类型不应该允许单个基类继承的原因.
(我的意思是,可以说,如果你最终得到一个巨大的继承层次结构,值类型的继承会很糟糕,但我主要想知道是否存在任何运行时限制而不是实际限制。)
谢谢。
我想知道.NET 值类型为什么不支持继承(忽略接口实现)是否有任何技术原因......我乍一看想不出为什么值类型不应该允许单个基类继承的原因.
(我的意思是,可以说,如果你最终得到一个巨大的继承层次结构,值类型的继承会很糟糕,但我主要想知道是否存在任何运行时限制而不是实际限制。)
谢谢。
考虑为值类型分配的内存。CLR 确切地知道为值类型的变量分配多少空间,因为它知道会有哪些字段。它不可能以具有更多字段的子类型值结束。
现在我们可以有值类型继承,它只是截断了一些东西:
ExtendedValueType evt = new ExtendedValueType(...);
BaseValueType bvt = evt;
// Now you couldn't cast back to ExtendedValueType, because we'd have lost
// information
同样,类型信息也无处存在于值本身中,因此任何被扩展类型覆盖的虚拟方法都不会被调用 via bvt
,因为就一切而言,该值只是BaseValueType
. 换句话说,很多“自然”继承特性会以我认为会引起很多混乱的方式丢失。
我相信值类型不支持继承的原因是它们在内存中的表示方式。值类型所表示的数据的大小以及因此而导致的数据取决于其组成字段。也就是说,如果您的值类型包含一个 int 和一个字符串,则 32 位系统上的总大小将为 8,或 4(int 大小)+ 4(指针大小)。这意味着在内存中表示的值类型是一个字节块,没有任何更多信息。
现在对比一下类类型,它们都是指针的大小,或者在 32 位系统上为 4。由于类类型的实例是指针,因此它们可以引用继承所需的内容,例如 VMT(虚拟方法表)和对父类信息的引用。这是值类型不能做的事情,因此值类型不支持继承。
假设可以做到。
您将能够重用某些实现。
但是继承的真正好处是替换和多态。它们需要按引用使用。
这就是为什么支持接口实现的原因,因为它总是涉及拳击。但这不适用于继承。