2016-09-13 36 views
11

Tôi nghi ngờ rằng tôi không thể giải quyết được. Tôi đã đọc tài liệu tại embarcadero cho class constructors nhưng tôi không thể hiểu được ý nghĩa của điều đó. Nói cách khác, chênh lệch sử dụng giữa một số constructorclass constructor là gì? Tôi đã làm điều này:Hàm tạo và hàm tạo lớp Delphi

type 
TGeneric<T> = class 
    private 
    FValue: T; 
    aboutString: string; 
    procedure setValue(const a: T); 
    public 
    property V: T read FValue write setValue; 
    property about: string read aboutString; 
    constructor Create; 
    destructor Destroy; override; 
end; 

implementation 

{ TGeneric<T> } 

constructor TGeneric<T>.Create; 
begin 
    inherited; 
    aboutString := 'test'; 
end; 

Thay vì mã này không hoạt động đúng:

type 
TGeneric<T> = class 
    private 
    FValue: T; 
    aboutString: string; 
    procedure setValue(const a: T); 
    public 
    property V: T read FValue write setValue; 
    property about: string read aboutString; 
    class constructor Create; 
    destructor Destroy; override; 
end; 

implementation 

{ TGeneric<T> } 

class constructor TGeneric<T>.Create; 
begin 
    inherited; 
    aboutString := 'test'; 
end; 

Tôi đoán rằng câu trả lời là trong dòng này của tài liệu:

Thông thường, constructor của lớp cha là được sử dụng để khởi tạo các trường tĩnh của lớp hoặc để thực hiện một kiểu khởi tạo, được yêu cầu trước khi lớp hoặc bất kỳ cá thể lớp nào hoạt động đúng.

Nói cho tôi biết nếu tôi đúng:

  • Constructor: Tôi có thể sử dụng inherited Create;, khởi tạo các biến và vân vân.
  • Nhà xây dựng lớp: Tôi có thể sử dụng điều này khi tôi phải tạo đối tượng trong lớp học ngay lập tức?

Ví dụ nhìn vào bên dưới:

type 
    TBox = class 
    private 
    class var FList: TList<Integer>; 
    class constructor Create; 
    end; 

implementation 

class constructor TBox.Create; 
begin 
    { Initialize the static FList member } 
    FList := TList<Integer>.Create(); 
end; 

end. 

Ở đây tôi sẽ để tạo ra các đối tượng ngay lập tức khi tôi gọi TBox.Create theo hình thức chính?

+3

Hãy nghĩ đến các nhà xây dựng lớp học như một cách để tự động khởi tạo loại lớp học của bạn. Chúng được tự động gọi khi khởi động và bạn sẽ không bao giờ gọi chúng bằng mã của bạn. Nói cách khác, các hàm tạo lớp hoạt động trên kiểu, trong khi các hàm tạo bình thường hoạt động trên các biến của bạn. –

+0

Vì vậy, tôi có thể tránh điều đó và chỉ quan tâm đến nhà xây dựng cổ điển? –

+0

Điều đó tùy thuộc vào những gì bạn muốn làm. Một lớp var là một loại biến toàn cục cho kiểu đó và có thể hữu ích trong một số trường hợp. –

Trả lời

17
  • Trình tạo lớp thực hiện chính xác một lần khi đơn vị được khai báo được khởi tạo. Một hàm tạo lớp là một phương thức lớp tĩnh và do đó, Self không được xác định.
  • Một hàm tạo thi hành khi được gọi một cách rõ ràng và có công việc khởi tạo một cá thể của một lớp.

Trong các trình xây dựng lớp học hoang dã, rất hiếm, các nhà xây dựng thường giống như muck. Rất có thể bạn không có nhu cầu ngay lập tức cho các nhà xây dựng lớp vì vậy hãy bỏ qua chúng ngay bây giờ. Tập trung vào sự hiểu biết làm thế nào để viết và sử dụng các nhà thầu.

Nếu trong tương lai bạn cần phải khởi tạo các biến thuộc sở hữu của lớp (trái ngược với sở hữu của một cá thể) thì bạn có thể thấy mình muốn sử dụng một hàm tạo lớp. Cho đến thời điểm đó, hãy thoải mái bỏ qua chúng.

+3

Lưu ý rằng một 'constructor' chỉ ** thực hiện nếu lớp được sử dụng. Vì vậy, không giống như một phần 'khởi tạo' bình thường của một đơn vị (luôn luôn thực thi), nó chỉ thực thi nếu lớp đó được sử dụng * ở đâu đó *. Điều này cũng đúng với một 'lớp destructor'. –

+0

Phần khởi tạo sẽ thực hiện nếu và chỉ khi đơn vị được tham chiếu. Tương tự như một hàm tạo lớp. Chỉ được gọi nếu lớp được tham chiếu. –

+0

Chỉ khi lớp học được sử dụng **. Bạn có thể khai báo một biến của lớp và nó sẽ không chạy. Init phần luôn chạy, một khi đơn vị được bao gồm. –

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