如果我有类A, B, C, D, E
,和接口,如X, Y, Z
,以及系统模型,如:内存分配一类是在.NET中有很深的继承
class B : A, X
class C : B, Y
class D : C, Z
class E : D
如果A
是一个抽象基类和E是当我创建E的一个实例时,除了E
之外,是否还会创建A, B, C, D, X, Y, Z
的实例?
如果是这样的话,这是否会造成巨大的性能开销?不是内存,但运行时和GC明智。
如果我有类A, B, C, D, E
,和接口,如X, Y, Z
,以及系统模型,如:内存分配一类是在.NET中有很深的继承
class B : A, X
class C : B, Y
class D : C, Z
class E : D
如果A
是一个抽象基类和E是当我创建E的一个实例时,除了E
之外,是否还会创建A, B, C, D, X, Y, Z
的实例?
如果是这样的话,这是否会造成巨大的性能开销?不是内存,但运行时和GC明智。
是的,它会A,B,C和d
的创建“嵌入式”情况下不,这不会产生X,Y和Z的情况下(因为它们是接口)
没有多余的内存分配开销或GC(ABCD)开销,因为E的实例被分配为1块。任何运行时间开销完全取决于涉及的构造函数。
总是会有contructors链(从E到A)正在执行,可能是默认的构造函数,但它也可以在1级调用多个构造函数。
继承扩展类型并不会创建实例。你得到E之一单个实例包括由A,B,C,d和E提供的方法和由这些类定义的属性访问和接口X,Y和Z.
定义的数据这将创建一个单一的对象 - 一个E的实例 - 但是这将包括在类层次结构中声明的所有字段。 (接口不能声明字段,因此它们与对象本身内的数据无关)。它只是影响对象占用的内存的字段(以及任何影响布局的属性)。
对E实例的引用可以“转换”为类型A,B,C,D,X,Y或Z的引用作为身份保持参考转换 - 即它仍然是对同一个对象。
谢谢乔恩。当你将E转换成上述任何一种时,它会创建一个新的实例吗?我认为它适用于基类,对吧?但对于接口? – 2010-03-04 21:03:12
此外,例如,如果您要将这些类合并到一个没有继承的类中,它们在内存,GC和运行时性能方面会差不多吗? – 2010-03-04 21:04:03
@Joan:你不转换E的实例,只有对实例的引用是'转换'的,这很便宜。 – 2010-03-04 21:06:51
对不起,但没有通过继承创建的实例! – AxelEckenberger 2010-03-04 20:59:31
@ Obalix,注意嵌入的引号。但是,是的,最终只涉及1个实例。 – 2010-03-04 21:01:10
感谢Henk,所以在这种情况下,例如,如果您要将这些类合并到一个没有继承的类中,它们在内存,GC和运行时性能方面几乎相同? – 2010-03-04 21:01:10