2010-03-04 32 views
5

如果我有类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明智。

回答

7

是的,它会A,B,C和d
的创建“嵌入式”情况下不,这不会产生X,Y和Z的情况下(因为它们是接口)

没有多余的内存分配开销或GC(ABCD)开销,因为E的实例被分配为1块。任何运行时间开销完全取决于涉及的构造函数。

总是会有contructors链(从E到A)正在执行,可能是默认的构造函数,但它也可以在1级调用多个构造函数。

+0

对不起,但没有通过继承创建的实例! – AxelEckenberger 2010-03-04 20:59:31

+0

@ Obalix,注意嵌入的引号。但是,是的,最终只涉及1个实例。 – 2010-03-04 21:01:10

+0

感谢Henk,所以在这种情况下,例如,如果您要将这些类合并到一个没有继承的类中,它们在内存,GC和运行时性能方面几乎相同? – 2010-03-04 21:01:10

2

继承扩展类型并不会创建实例。你得到E之一单个实例包括由A,B,C,d和E提供的方法和由这些类定义的属性访问和接口X,Y和Z.

定义的数据
7

这将创建一个单一的对象 - 一个E的实例 - 但是这将包括在类层次结构中声明的所有字段。 (接口不能声明字段,因此它们与对象本身内的数据无关)。它只是影响对象占用的内存的字段(以及任何影响布局的属性)。

对E实例的引用可以“转换”为类型A,B,C,D,X,Y或Z的引用作为身份保持参考转换 - 即它仍然是对同一个对象。

+0

谢谢乔恩。当你将E转换成上述任何一种时,它会创建一个新的实例吗?我认为它适用于基类,对吧?但对于接口? – 2010-03-04 21:03:12

+0

此外,例如,如果您要将这些类合并到一个没有继承的类中,它们在内存,GC和运行时性能方面会差不多吗? – 2010-03-04 21:04:03

+1

@Joan:你不转换E的实例,只有对实例的引用是'转换'的,这很便宜。 – 2010-03-04 21:06:51