32. Hiểu rõ loại lớp (class) mà bạn đang viết

Estimated reading: 4 minutes 261 views

Tóm tắt

“Biết mình là ai”: Có nhiều loại lớp khác nhau. Hãy biết rõ bạn đang viết loại nào.

Thảo luận

Các loại lớp khác nhau phục vụ cho những mục đích khác nhau, và do đó tuân theo những quy tắc khác nhau.

  • Lớp giá trị (Value classes) (ví dụ: std::pair, std::vector) được mô phỏng theo kiểu dữ liệu dựng sẵn. Một lớp giá trị:

    • Có một Hàm huỷ công khai (public destructor); Hàm tạo sao chép (copy constructor); và toán tử gán với ngữ nghĩa giá trị (value semantics).

    • Không có hàm ảo (kể gồm cả hàm huỷ (destructor)).

    • Được thiết kế để dùng như một lớp cụ thể, không phải lớp cơ sở (Mục 35).

    • Thường được khởi tạo trên stack hoặc làm thành viên trực tiếp của một lớp khác.

  • Lớp cơ sở (Base classes) là nền tảng để xây dựng hệ thống phân cấp lớp (class hierarchies). Một lớp cơ sở:

    • Có destructor công khai và ảo (public & virtual), hoặc được bảo vệ (protected) và không ảo (protected & nonvirtual) (Mục 50), cùng với hàm tạo sao chép (copy constructor) và toán tử gán không công khai (nonpublic) (Mục 53).

    • Thiết lập giao diện thông qua các hàm ảo (virtual functions).

    • Thường được khởi tạo động trên heap và sử dụng thông qua (smart) pointer.

  • Lớp đặc tính (Traits classes) về cơ bản là template mang thông tin về kiểu dữ liệu. Một traits class:

    • Chỉ chứa typedefs và hàm tĩnh (static function). Không có trạng thái thay đổi và không có hàm ảo.

    • Thường không được khởi tạo (thậm chí việc khởi tạo thường bị vô hiệu hoá).

  • Lớp chính sách (Policy classes) (thường là template) là các mảnh hành vi có thể cắm ghép (pluggable). Một policy class:

    • Có thể có hoặc không có trạng thái hoặc hàm ảo.

    • Thường không được khởi tạo độc lập, mà chỉ làm lớp cơ sở hoặc thành viên.

  • Lớp ngoại lệ (Exception classes) có sự pha trộn đặc biệt giữa ngữ nghĩa giá trị và tham chiếu: chúng được ném (throw) theo giá trị nhưng bắt (catch) theo tham chiếu (Mục 73). Một lớp ngoại lệ:

    • Có hàm huỷ công khai (public destructor) và các hạm tạo (constructor) không được phép thất bại (đặc biệt là constructor sao chép không thất bại; nếu constructor sao chép của ngoại lệ ném ra ngoại lệ thì chương trình sẽ bị huỷ).

    • Có các hàm ảo, và thường triển khai cơ chế nhân bản (cloning, Mục 54) và cơ chế thăm viếng (visitation).

    • Tốt nhất là kế thừa ảo từ std::exception.

  • Lớp phụ trợ (Ancillary classes) thường hỗ trợ cho những idiom đặc thù (ví dụ: RAII; Mục 13). Chúng cần được thiết kế để dễ sử dụng đúng và khó sử dụng sai (ví dụ: xem Mục 53).

 

Tham khảo

[AbrahamsOlb] • [AlexandrescuOOa] • [AlexandrescuOOb] • [AlexandrescuOl] §3 • [Meyers96] §13 • [StroustrupOO] §8.3.2, §10.3, §14.4.6, §25.1 • [Vandevoorde03] §15

Link 

Leave a Comment

Chia sẻ:

32. Hiểu rõ loại lớp (class) mà bạn đang viết

Or copy link

CONTENTS