Если у меня есть классы A, B, C, D, E
, и интерфейсы как X, Y, Z
, и модель система как:
class B : A, X
class C : B, Y
class D : C, Z
class E : D
Если A
абстрактный базовый класс, и E является классом интереса, когда я создаю экземпляр E, был бы он в свою очередь создавать экземпляры A, B, C, D, X, Y, Z
в дополнение к E
?
Если это так, это создало бы огромную производительность наверху? Не память, но время выполнения и мудрый GC.
Да, он будет создавать «встроенные» экземпляры A, B, C и D
Нет, он не будет создавать экземпляры X, Y и Z (поскольку они являются интерфейсами)
Нет дополнительных накладных расходов для выделения памяти или GC (ABCD), потому что экземпляр E выделяется как 1 блок. Любые накладные расходы времени выполнения будут полностью зависеть от задействованных конструкторов.
Всегда будет выполняться цепочка конструкторов (от E до A), возможно, конструктор по умолчанию, но также можно вызывать несколько конструкторов на 1 уровне.
Наследование расширяет тип и не создает экземпляров. У вас есть один единственный экземпляр E, который включает данные, определенные A, B, C, D и E. Он предоставляет методы и средства доступа к свойствам, определенные этими классами и интерфейсами X, Y и Z.
{{1} }Будет создан один объект - экземпляр E, но который будет включать все поля, объявленные в иерархии классов. (Интерфейсы не могут объявлять поля, поэтому они не имеют отношения к данным внутри самого объекта.) Только поля (и, по общему признанию, любые атрибуты, влияющие на макет) вносят вклад в память, занимаемую объектом.
Ссылка на экземпляр E может быть «преобразована» в ссылку типа A, B, C, D, X, Y или Z как преобразование ссылки с сохранением идентичности - то есть она все равно будет ссылкой на тот же объект.