Hãy xem xét ví dụ sau (Tôi đang sử dụng Delphi XE):Delphi XE: constructor lớp không được gọi trong một lớp học sử dụng Generics
program Test;
{$APPTYPE CONSOLE}
type
TTestClass<T> = class
private
class constructor CreateClass();
public
constructor Create();
end;
class constructor TTestClass<T>.CreateClass();
begin
// class constructor is not called. this line never gets executed!
Writeln('class created');
end;
constructor TTestClass<T>.Create();
begin
// this line, of course, is printed
Writeln('instance created');
end;
var
test: TTestClass<Integer>;
begin
test := TTestClass<Integer>.Create();
test.Free();
end.
Các constructur lớp không bao giờ được gọi là và do đó dòng 'lớp tạo 'không được in. Tuy nhiên, nếu tôi xóa tổng quát và thực hiện TTestClass<T>
thành một lớp tiêu chuẩn TTestClass
, mọi thứ hoạt động như mong đợi.
Tôi có thiếu thứ gì đó với generics không? Hay đơn giản là nó không hoạt động?
Bất kỳ suy nghĩ nào về điều này sẽ được ứng dụng!
Xin cảm ơn, --Stefan--
[tài liệu] (http://docwiki.embarcadero.com/RADStudio/en/Methods#Class_Constructors) nêu rõ: "Lưu ý: Trình tạo lớp cho lớp hoặc bản ghi chung có thể thực thi nhiều lần. Số lần chính xác constructor lớp được thực hiện trong trường hợp này phụ thuộc vào số phiên bản chuyên biệt của kiểu generic. Ví dụ, hàm tạo lớp cho một lớp TList chuyên dụng có thể thực thi nhiều lần trong cùng một ứng dụng. " Nhưng nó trông hơi giống một con bọ vậy. –
Có. Tôi cũng đọc nó. Trừ khi "nhiều lần" bao gồm 0 lần, điều này thực sự trông giống như một lỗi. – Schafsmann
Quy tắc chung: Đừng cố gắng tạo một ứng dụng .dpr tự chứa. Luôn có ít nhất một đơn vị và giữ tất cả mọi thứ trong các tệp DPR mà bạn có thể giữ lại. –