2010-03-04 32 views
5

Nếu tôi có các lớp học A, B, C, D, E, và giao diện như X, Y, Z, và mô hình hóa một hệ thống như:cấp phát bộ nhớ cho một lớp học có thừa kế sâu trong .NET

class B : A, X 
class C : B, Y 
class D : C, Z 
class E : D 

Nếu A là một lớp cơ sở trừu tượng và E là lớp học quan tâm, khi tôi tạo ra một thể hiện của E, nó sẽ lần lượt tạo ra các trường hợp của A, B, C, D, X, Y, Z ngoài E?

Nếu trường hợp đó xảy ra, điều này có tạo ra chi phí hiệu năng lớn không? Không phải bộ nhớ, nhưng thời gian chạy và GC khôn ngoan.

Trả lời

7

Có, nó sẽ tạo ra các trường hợp 'nhúng' của A, B, C và D
Không, nó sẽ không tạo ra các trường hợp của X, Y và Z (vì họ là giao diện)

Không có thêm chi phí cho việc cấp phát bộ nhớ hoặc GC (của ABCD) vì thể hiện của E được phân bổ là 1 khối. Mọi chi phí thời gian chạy sẽ hoàn toàn phụ thuộc vào các nhà thầu có liên quan.

Sẽ luôn có một chuỗi các contructors (từ E đến A) được thực thi, có thể là hàm tạo mặc định nhưng cũng có thể gọi nhiều hàm tạo ở mức 1.

+0

Xin lỗi, nhưng không có trường hợp nào được tạo bởi thừa kế! – AxelEckenberger

+0

@ Obalix, lưu ý các dấu ngoặc kép xung quanh được nhúng. Nhưng có, cuối cùng chỉ có 1 trường hợp liên quan. –

+0

Cảm ơn Henk, vì vậy trong trường hợp đó, ví dụ nếu bạn đã hợp nhất các lớp này thành một lớp đơn không thừa kế, liệu chúng có giống nhau về mặt bộ nhớ, GC và hiệu suất thời gian chạy không? –

2

Thừa kế mở rộng Loại và không tạo phiên bản. Bạn có một cá thể E bao gồm dữ liệu được xác định bởi A, B, C, D và E. Nó cung cấp các phương thức và trình truy cập thuộc tính được xác định bởi các lớp này và giao diện X, Y và Z.

7

Nó sẽ tạo một đối tượng duy nhất - một thể hiện của E - nhưng nó sẽ bao gồm tất cả các trường được khai báo trong hệ thống phân cấp lớp. (Giao diện không thể khai báo các trường, vì vậy chúng không liên quan đến dữ liệu trong chính đối tượng.) Chỉ có các trường (và bất kỳ thuộc tính nào ảnh hưởng đến bố cục, thừa nhận) đóng góp vào bộ nhớ được một đối tượng đưa ra.

Tham chiếu đến E có thể được "chuyển đổi" thành tham chiếu loại A, B, C, D, X, Y hoặc Z dưới dạng chuyển đổi tham chiếu bảo toàn danh tính - tức là nó vẫn là tham chiếu đến cùng một đối tượng.

+0

Cảm ơn Jon. Khi bạn chuyển đổi E thành bất kỳ ở trên, nó sẽ tạo ra một thể hiện mới? Tôi nghĩ rằng nó cho các lớp cơ sở, phải không? Nhưng đối với giao diện? Ví dụ: –

+0

Ví dụ: nếu bạn đã hợp nhất các lớp này thành một lớp đơn không có kế thừa, chúng có khá giống nhau về mặt bộ nhớ, GC và hiệu suất thời gian chạy không? –

+1

@Janan: Bạn không chuyển đổi thể hiện của E, chỉ tham chiếu đến một cá thể là 'được chuyển đổi', rất rẻ. –

Các vấn đề liên quan