Trong constructor của bạn
inherited;
gọi các nhà xây dựng với danh sách tham số giống hệt nhau để xây dựng của bạn. Hàm tạo của bạn không có tham số và do đó, inherited
gọi hàm tạo không làm gì trong TObject
. Không chỉ có bạn bị mất so sánh của bạn, nhưng trường hợp của bạn là thiếu phần còn lại của các bước cần thiết trong xây dựng.
Khi bạn thay thế nó với
inherited Create;
trình biên dịch thay vì thực hiện Nghị quyết phương pháp thông thường. Nó tìm kiếm danh sách tổ tiên của lớp và gọi phương thức đầu tiên mà nó có thể. Trong trường hợp đó là:
constructor Create(ACapacity: Integer = 0); overload;
Do đó, cá thể của bạn được tạo đúng cách.
Các tài liệu là ở đây: http://docwiki.embarcadero.com/RADStudio/en/Methods#Inherited
trích đoạn chính là:
Nếu thừa hưởng được theo sau là tên của một thành viên, nó đại diện cho một phương pháp gọi bình thường
và
Khi được kế thừa không có số nhận dạng sau nó, nó tham chiếu s với phương thức được kế thừa có cùng tên với phương pháp kèm theo hoặc, nếu phương thức kèm theo là trình xử lý tin nhắn, cho trình xử lý tin nhắn được kế thừa cho thông báo tương tự . Trong trường hợp này, kế thừa không có tham số rõ ràng, nhưng chuyển sang phương thức được kế thừa cùng các tham số mà phương thức kèm theo được gọi. Ví dụ:
inherited;
xảy ra thường xuyên trong việc triển khai các nhà thầu. Nó gọi phương thức khởi tạo được thừa kế với cùng các thông số đã được truyền cho hậu duệ .
Khá lạ phải không. Trên khuôn mặt của nó, có vẻ như đáng kinh ngạc rằng các phương pháp khác nhau được gọi là. Điểm mấu chốt là mặc dù số inherited
đơn giản dẫn đến kết hợp chính xác các danh sách tham số. Và phương pháp của bạn không có tham số.
Mặt khác, inherited Create
là cuộc gọi phương thức chuẩn. Trong trường hợp thứ hai, bạn kết thúc gọi một phương thức với một tham số, sử dụng giá trị mặc định cho tham số đó. Vì vậy, trong khi có vẻ như bạn đang gọi một constructor parameterless bạn không. Bạn đang chuyển một thông số, ACapacity
và giá trị là 0
.
Trước đây bạn có một nhà xây dựng không? – Dsm