2009-09-17 22 views
6

Tôi đọc về các nhà xây dựng ảo được sử dụng để thực hiện một số mẫu thiết kế, nhưng không hiểu bất kỳ nhu cầu của các nhà thầu ảo. Vậy các nhà thầu ảo là gì và tại sao chúng ta thực sự cần chúng?Trường hợp nhà thầu ảo được sử dụng?

Trả lời

12

Trong hầu hết các ngôn ngữ lập trình, bạn không thể tìm thấy các nhà thầu ảo. Việc ghi đè lên các thành viên ảo được đánh giá trong thời gian chạy sau khi một đối tượng được xây dựng, nhưng trong hầu hết các ngôn ngữ, bạn cần phải biết lớp thực tế khi xây dựng cá thể. Do đó các nhà xây dựng ảo không có ý nghĩa trong các ngôn ngữ này.

Trong .NET, bạn có thể nhận được một giải pháp tương tự thông qua sự phản chiếu, tức là bạn có thể xây dựng một đối tượng thông qua một thể hiện của lớp Kiểu đại diện cho đối tượng bạn muốn xây dựng. Và với sự hỗ trợ chung, bạn cũng có thể đạt được một cái gì đó tương tự, nhưng nó không phải là các nhà xây dựng ảo.

Ngôn ngữ lập trình duy nhất mà tôi đã làm việc với các nhà thầu ảo thực sự là Delphi. Trong Delphi, có một "loại Metaclass" cụ thể, tức là một cấu trúc lập trình cụ thể đại diện cho một metaclass (trong khi đó trong .NET, lớp meta, lớp Type, chỉ là một thể hiện của một lớp bình thường). Vì vậy, nếu bạn có một lớp được gọi là TMyClass - Deplhi quy ước đặt tên;)

TMyClass : Class ... 

Bạn có thể khai báo metaclass như thế này

TMyMetaClass : class of TMyClass 

Bây giờ, bạn có thể khai báo một biến mà là của TMyMetaClass loại,

MyMetaClassVariable : TMyMetaClass 
... 
// Assign the meta class to refer to our concrete class 
MyMetaClassVariable := TMyClass; 

Và bạn có thể tạo phiên bản mới thông qua biến này

MyClassInstance := MyMetaClassVariable.Create(); 

Hiện tại, MyMetaClassVariable có thể tham chiếu đến bất kỳ lớp nào là TMyClass hoặc chuyên môn hóa. Nếu hàm tạo được khai báo là ảo, thì biến sẽ được tạo với một cá thể của lớp cụ thể đó.

Trong cùng một cách, bạn có thể khai báo các phương thức tĩnh ảo trong Delphi và gọi chúng thông qua một cá thể của metaclass.

Vì vậy, câu hỏi khác? Tại sao chúng ta cần chúng? Vâng, trong Delphi, họ giải quyết một số vấn đề tương tự như lớp Type trong .NET, cho phép bạn xây dựng các đối tượng mà bạn không biết tên lớp tại thời điểm thiết kế. Ví dụ, khi bạn thiết kế một biểu mẫu và bạn đặt vào một loạt các điều khiển, dữ liệu này phải được tuần tự hóa bởi nhà thiết kế và được deserialized. Khi biểu mẫu được deserialized, sau đó nó thực sự là các kiểu dữ liệu được đọc, và các trường hợp chính xác (có thể là TextBox, ComboBox, vv) được xây dựng bằng cách gọi hàm tạo ảo trên siêu dữ liệu.

+0

Cú pháp Delphi là chính xác. –

+0

@Gamecat - cảm ơn, tôi đã xóa "tuyên bố từ chối trách nhiệm" của mình;) Không cần thiết vì đó là tiếng ồn. – Pete

+0

Thực ra, đó là 'TMyClass = class', tức là' = 'chứ không phải': '. –

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