我知道.NET中的结构不支持继承,但不清楚为什么它们以这种方式受限.
什么技术原因阻止结构继承其他结构?
从C#结构继承是不可能的.这对我来说并不明白为什么会这样:
我想知道这是否是CLR中的技术限制,还是C#编译器阻止你做的事情?
编辑:值类型不能有虚拟方法,我意识到这个限制排除了大多数你想要使用继承的场景.但是,这仍然会留下继承 - 聚合.想象一个Shape带有Colour字段的结构:我可以编写接受任何结构派生的代码Shape,并访问其Colour字段,即使我永远不能编写虚Shape.Draw方法.
我可以想到一个会被非密封值类型破坏的场景.值类型都应该落实Equals和GetHashCode正确; 即使这两个方法System.Object都是虚拟的,它们也会在值类型上被非虚拟地称为.即使值类型没有被密封,编写从另一个派生的结构的人也无法编写自己的这两种方法的实现,并期望正确调用它们.
我应该指出,我并不是说我应该能够从我自己的代码中继承结构.但是,我想要做的是猜测为什么.NET禁止这种特殊代码气味.
编辑2:我刚刚发现了这个非常相似的问题,其答案实际上是"因为那时价值类型的数组不起作用".
出于好奇:CLR如何调度虚拟方法调用接口成员到正确的实现?
我知道CLR为每种类型维护的VTable,每个方法都有方法槽,并且每个接口都有一个额外的方法槽列表,指向相关的接口方法实现.但我不明白以下内容:CLR如何有效地确定从类型的VTable中选择哪个接口方法槽列表?
从2005年5月刊的MSDN杂志中了解CLR如何创建运行时对象的文章Dril Into .NET Framework Internals讨论了由接口ID索引的进程级映射表IVMap.这是否意味着同一进程中的所有类型都具有指向同一IVMap的相同指针?
它还指出:
如果
MyInterface1由两个类实现,则IVMap表中将有两个条目.该条目将指回嵌入在MyClass方法表中的子表的开头.
CLR如何知道要选择哪个条目?它是否进行线性搜索以查找与当前类型匹配的条目?还是二元搜索?或者某种直接索引并且有一个可能有很多空条目的地图?
我还通过C#第3版阅读了CLR中的接口章节,但它没有谈到这一点.因此,这个问题的答案没有回答我的问题.
在C#,任何用户定义的struct自动是的一个子类System.Struct System.ValueType和System.Struct System.ValueType是的一个子类System.Object.
但是当我们为对象类型引用分配一些结构时,它会被装箱.例如:
struct A
{
public int i;
}
A a;
object obj = a; // boxing takes place here
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:如果A是后代System.Object,编译器不能将它上传到对象类型而不是装箱吗?
在那里,我在C#XNA 4.0中制作2D游戏,并再次遇到我的小烦恼; 该矩形.对于那些使用基本碰撞的人来说,这几乎是必需的.对于几乎所有创建的游戏对象,您都需要有一个矩形.然后我去改变X,检查碰撞或其他任何东西.在那里,我开始了永无止境的战斗objectName.Rectangle.Whatever.为了解决这个问题,我当然会给出一些objectName属性/方法来为我访问这些属性/方法.
然后我敢于梦想.我有一个伟大的设计来制作一个基本的游戏对象类,所有drawable将继承,这将允许父母,精确的本地坐标(浮点数),并保持纹理/ spritebatch.为了完成这个,我准备从Rectangle继承,使用它拥有的所有方法和属性.哎呀,每当需要一个Rectangle的东西时,我可能会懒得说objectName,而不是objectName.Rectangle.
然后我意识到,不是机会.我开始感到沮丧,因为我很聪明的想法被砸碎了.从那时起,我完美的小班级拥有一个矩形,各种方法和属性根据需要访问它.我也有机会从XNA DrawableGameComponent继承它.虽然从长远来看这更实用,每次我查看绘制或更新方法并看到我经常想到的矩形调用时,是否有希望做我想要的事情?我可以做一些聪明的工作吗?或者是从一个真正被我掌握的矩形继承而来?
虽然使用XNA中提供的DrawableGameComponent类允许大多数与游戏对象相关的动作发生在类Update()方法中,但每次在类之外我需要引用的不是Rectangle的属性,而是Rectangle本身,我稍微考虑到实际上我的对象实际上是各种各样的方式,并且加强了Rectangle.然后我再一次发现自己在问:
有没有办法从预定义的结构继承,或者给项目留下你的印象(一种解决方法)?
我有一个问题,抓住结构的概念,没有人能回答我的问题.我知道它"像"一个对象,你可以有方法和领域.我不明白的是为什么他们被密封了.为什么缺乏继承和多态性限制了他们的能力.结构体是否真的有很多现实世界的使用,我知道它们比一个对象小,我找不到任何真正的例子来帮助我理解它的好处.谢谢.