2009-05-09 28 views
15

Delphi 2006 giới thiệu các khả năng mới cho các bản ghi, khiến chúng trở nên 'hướng đối tượng' hơn.Khi nào tôi nên sử dụng các loại bản ghi nâng cao trong Delphi thay vì các lớp học?

Trong trường hợp nào loại bản ghi phù hợp hơn với thiết kế so với loại lớp? Lợi thế nào khi sử dụng các loại bản ghi này?

+0

Bạn có thể xem [trình bao bọc mảng động của chúng tôi] (http://blog.synopse.info/post/2011/03/12/TDynArray-and-Record-compare/load/save-using -fast-RTTI), thêm các phương thức giống như TList cho bất kỳ mảng động nào. Nó cũng có thể tuần tự hóa nội dung mảng/bản ghi. Tôi cũng phát hiện ra một lỗi ngẫu nhiên trong Delphi 2010 (ít nhất), về các đối tượng: đôi khi, [đối tượng được tính tham chiếu không được khởi tạo] (http://blog.synopse.info/post/2011/01/29/record-and -object-issue-in-Delphi-2010)! Trong trường hợp này, bạn phải sử dụng các bản ghi cho các cấu trúc như vậy. –

Trả lời

15

Bạn có hồ sơ, đối tượng và lớp học.

Các bản ghi có sẵn từ turbo pascal 1.Chúng có trọng lượng nhẹ, có khả năng có các thuộc tính và phương thức, nhưng chúng không hỗ trợ kế thừa, Có một số vấn đề với các hàm trả về các bản ghi. Nếu những hồ sơ này có các phương pháp, điều này đôi khi gây ra lỗi nội bộ:

type 
    TRec = record 
    function Method1: Integer; 
    end; 

function Func: TRec; 


procedure Test; 
var 
    x : TRec; 

begin 
    Func.Method1; // Sometimes crashes the compiler 
    // Circumvention: 
    x := Func; 
    x.Method1; // Works 
end; 

Đối tượng được giới thiệu với turbo pascal 5 nếu tôi đúng. Sau đó, họ cung cấp một cách cho OO với pascal. Họ được nhiều hơn hoặc ít hơn không được chấp thuận với sự ra đời của Delphi, nhưng bạn vẫn có thể sử dụng chúng. Các đối tượng có thể thực hiện các giao diện.

Các lớp học được giới thiệu với Delphi 1 và linh hoạt nhất. Họ thực hiện các giao diện và hỗ trợ kế thừa. Nhưng mỗi biến lớp là một con trỏ ẩn. Điều này có nghĩa là các lớp cần được tạo trên heap. May mắn quá trình này chủ yếu là ẩn.

Dưới đây là bảng có sự khác biệt giữa ba. Tôi đã thêm giao diện để hoàn thành.

    |Class|Object|Record|Interface| 
------------------|-----------------------------| 
Are pointers?  | y | n | n | y | 
Inheritance  | y | y | n | y | 
Helpers   | y | n | y | n | 
Impl. Interface | y | y | n | - | 
Visibility  | y | y | n | n | 
Method   | y | y | y | y | 
Fields   | y | y | y | n | 
Properties  | y | y | y | y | 
Consts   | y | y | y | n | 
Types    | y | y | y | n | 
Variants   | n | n | y | n | 
Virtual   | y | n | y | - | 
------------------|-----------------------------| 
+0

. được hỗ trợ trong Delphi? Tôi biết về "thủ tục xx của đối tượng;" nhưng không thể nhớ thấy chúng ở bất cứ nơi nào khác. –

+0

Có các đối tượng vẫn được hỗ trợ trong D2009. Không có trình trợ giúp đối tượng, nhưng các đối tượng có thể thực hiện các giao diện. –

+1

Và "thủ tục xx của đối tượng" contruct là để tuyên bố sự kiện chữ ký cho các phương pháp, AFAIK không có gì để làm với các đối tượng. –

1

Bạn có thể sử dụng operator overloading (như chuyển đổi ngầm). Điều này bạn có thể làm trên Delphi 2007+ hoặc 2006.NET trên các đối tượng quá, nhưng chỉ trên những hồ sơ này vào năm 2006 win32.

8

Tôi nghĩ rằng các tính năng đó cũng có sẵn trong Delphi 8 và 2005.

Hướng dẫn chính: nếu bạn nghi ngờ, hãy sử dụng lớp học.

Đối với phần còn lại, bạn phải hiểu sự khác biệt chính: Các đối tượng lớp luôn được sử dụng thông qua một tham chiếu và được tạo bằng cách gọi một Constructor.

Việc quản lý và cấp phát bộ nhớ cho Bản ghi cũng giống như đối với các loại cơ bản (tức là số nguyên, gấp đôi). Điều đó có nghĩa là chúng được truyền cho các phương thức theo giá trị (trừ khi var được sử dụng). Ngoài ra, bạn không cần bản ghi miễn phí và đó là lý do họ hỗ trợ quá tải toán tử. Nhưng không có phương pháp thừa kế hoặc ảo vv Các bản ghi mới có thể có một hàm tạo nhưng việc sử dụng nó là loại tùy chọn.

Các khu vực chính và tiêu chí cho việc sử dụng hồ sơ:

  • khi giao dịch với cấu trúc từ API Win32

  • khi các loại không có bản sắc (vì gán nghĩa sao chép)

  • khi các phiên bản không quá lớn (sao chép các bản ghi lớn trở nên đắt đỏ)

  • w hen các loại giá trị xây dựng, có hành vi nên bắt chước các loại số. Ví dụ là DateTime, số phức, vectơ vv Và sau đó quá tải toán tử là một tính năng tốt đẹp, nhưng không làm cho yếu tố quyết định đó.

Và hiệu quả-khôn ngoan, đừng lạm dụng điều này:

  • với nhiều loại nhỏ hơn mà bạn đặt vào mảng thường.

Và cuối cùng, quy tắc sử dụng lớp học hoặc bản ghi chưa thực sự thay đổi hình thành các phiên bản trước của Delphi.

+0

Chúng có sẵn cho nền tảng Delphi.NET, nhưng không dành cho win32 Delphi cho đến năm 2007. – DiGi

+0

mjustin không cụ thể về các tính năng, nhưng các thuộc tính, phương thức và công cộng/riêng tư đã có trong D2005/win32 –

6

Ngoài các câu trả lời khác (toán tử quá tải, loại giá trị trọng lượng nhẹ), bạn nên tạo bản ghi của bảng liệt kê thay vì các lớp. Vì chúng được cấp phát trên stack, không cần phải xây dựng và hủy chúng, điều này cũng loại bỏ sự cần thiết cho việc ẩn try..finally chặn trình biên dịch đặt xung quanh các điều tra kiểu lớp.

Xem http://hallvards.blogspot.com/2007/10/more-fun-with-enumerators.html để biết thêm thông tin.

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