2010-07-01 11 views
23

Xin vui lòng ai đó có thể giải thích cho tôi sự khác biệt giữa các thành viên lớp học công cộng và xuất bản ở Delphi là gì?Sự khác biệt giữa các thành viên lớp học công khai và công khai ở Delphi là gì?

Tôi đã cố gắng xem xét trợ giúp Delphi và tôi hiểu rằng các thành viên này có cùng khả năng hiển thị, nhưng tôi không hiểu rõ chúng khác nhau như thế nào và khi nào tôi nên sử dụng các thành viên được xuất bản thay cho các thành viên công cộng.

Cảm ơn rất nhiều.

Trả lời

20

Thuộc tính công khai và thuộc tính đã xuất bản có cùng mức hiển thị như bạn đã nêu. Các thuộc tính đã xuất bản được bao gồm trong RTTI, các thuộc tính công cộng thì không.

+7

RTTI là viết tắt của Run Time Type Information hoặc thông tin mà Delphi Compiler cần lúc thiết kế để làm cho thanh tra đối tượng và các phần khác của IDE Delphi hoạt động chính xác tại thời điểm thiết kế. –

+4

Để hoàn thành: Delphi 2010 có thể tạo RTTI cho các thành viên công cộng, trên thực tế có thể tạo RTTI cho tất cả các thành viên, bao gồm cả bảo vệ và riêng tư. Nhưng các thành viên đã xuất bản vẫn là những người "được xuất bản" bởi Object Inspector và được sử dụng bởi cơ chế tự động truyền trực tuyến. –

+0

Pascal miễn phí có hoạt động như Delphi 2010 không? Như trong, nó có tạo ra RTTI cho các thuộc tính công cộng không? Nó sẽ được an toàn để không sử dụng được xuất bản cho đơn giản? – jocull

23

Trình biên dịch tạo siêu dữ liệu RTTI (Thông tin loại thời gian chạy) cho các thành viên đã xuất bản, nhưng không cho các thành viên công khai (theo mặc định). Tác dụng chính của điều này là các thuộc tính được xuất bản của một đối tượng sẽ xuất hiện trong Object Inspector tại thời điểm thiết kế.

Tôi không biết nếu bạn đang viết các thành phần, nhưng nếu bạn làm, bạn có thể biết rằng các thuộc tính và sự kiện thường được xuất bản, để chúng có thể được thiết lập bằng cách sử dụng Object Inspector.

Công

public 
    property MyProperty: integer read FMyProperty write FMyProperty 

MyProperty sẽ không được visisble trong Inspector Object.

đăng

published 
    property MyProperty: integer read FMyProperty write FMyProperty 

MyProperty sẽ visisble trong Inspector Object.

+3

Trong khi điều này là chính xác, nguyên nhân cơ bản cho lý do tại sao nó xuất hiện trong thanh tra đối tượng là siêu dữ liệu RTTI có mặt cho các thành viên được xuất bản. Nói cách khác, những gì bạn thấy là một ảnh hưởng của sự khác biệt cơ bản. Câu trả lời đúng hơn là các thành viên đã xuất bản có RTTI, trong khi các thành viên công cộng thì không. –

+0

@Lasse V. Karlsen: Vâng, bạn nói đúng. Nhưng vì đây có lẽ là sự khác biệt rõ ràng nhất (?), Và không có câu trả lời nào khác đã chỉ ra nó, tôi sẽ không loại bỏ câu trả lời của tôi ngay bây giờ. –

+0

Xin lỗi, tôi đã không làm cho bản thân mình rõ ràng đủ :) Tôi đồng ý, đây là hiệu ứng quan sát nhất của sự khác biệt. Quan điểm của tôi là bạn nên chỉ ra rằng sự khác biệt cơ bản là RTTI, không loại bỏ câu trả lời của bạn (mặc dù các câu trả lời khác đang chỉ đến RTTI bây giờ.) –

4

Thuộc tính đã xuất sẽ xuất Thông tin loại thời gian chạy (RTTI).

Có một cái nhìn here về RTTI trong Delphi

3

Runtime Loại Informations (RTTI) chỉ được tạo ra cho published thành viên lớp.

+0

Trừ khi {$ M +}/{$ TYPEINFO ON} được chỉ định, trong trường hợp này các thành viên công cộng sẽ có RTTI quá – mjn

+0

Nếu đó là sự thật, @Mjustin, thì đó là thay đổi so với các phiên bản Delphi trước đó. Nó được sử dụng để được rằng * mà không có * $ M +, công khai và xuất bản là tương đương. Tức là, phần được xuất bản không tạo RTTI trừ khi $ M + có hiệu lực. –

3

Tại thời gian chạy, các mục nhập trong các mục được xuất bản và công khai đều có thể truy cập được.

Sự khác biệt chính giữa chúng là các mục đã xuất bản của thành phần xuất hiện trong thanh tra đối tượng tại thời điểm thiết kế.

Điều này xảy ra vì, đối với các trường trong phần được xuất bản RTTI được tạo tự động.

Thanh tra đối tượng chọn mục này và sử dụng nó để xác định nội dung cần thêm vào danh sách thuộc tính và sự kiện của nó.

9

Như một mặt lưu ý, có một điều đặc biệt với bố:

Tầm nhìn mặc định của các thành viên lớp là published, vì vậy kiểm tra mã không an toàn như:

TTopSecret = class(TObject) 
    Name: string; 
    Password: string; 

    function DecryptPassword(const AValue): string; 
    public 
    constructor Create(const AName, AEncryptedPassword: string); 
    end; 

Name, PasswordDecryptPassword() hiển thị 'toàn thế giới'.

3

Ngoài các câu trả lời khác:

Thuộc tính đã xuất được tự động lưu trữ bởi hệ thống phát trực tiếp. Ví dụ: nếu bạn có bản sao con của TComponent và ghi nó vào TStream với WriteComponent, tất cả (tốt, không phải tất cả, nhưng đó là một câu hỏi khác) các thuộc tính đã xuất bản được ghi vào luồng mà không cần thêm mã nào.

Tất nhiên, hệ thống phát trực tuyến chỉ có thể thực hiện điều đó vì RTTI có sẵn cho các thuộc tính đã xuất bản đó.

+0

Đây có lẽ là sự khác biệt quan trọng nhất! RTTI chỉ là một số 'keo' cần thiết để làm cho điều này xảy ra. – Roddy

4

Có vẻ như đã có rất nhiều câu trả lời hay, đã chỉ ra Object INspector, RTTI, vv Đây là tất cả các phần của câu đố.

Nếu bạn lấy đi từ khóa đã xuất bản, toàn bộ thiết kế công cụ RAD Delphi sẽ yêu cầu một số cách xác định thuộc tính nào được lưu trữ trong DFM, được kiểm tra trong thanh tra thuộc tính thành phần và có thể được tải lại khi chạy từ DFM. mô-đun dữ liệu hoặc biểu mẫu được tạo.

Điều này, trong một từ, là những gì được xuất bản cho. Điều thú vị với tôi là các nhà thiết kế của QT (ban đầu là TrollTech, sau này là một phần của Nokia, sau này vẫn quay về Digia) phải mô phỏng mức RTTI này cho thư viện C++ RAD của họ "QT", bổ sung một "tương đương" được công bố và "tài sản" tương đương, trong khi C++ tinh khiết vẫn thiếu cơ sở cơ bản này.