Nếu tôi có các lớp con khác nhau và thuật toán hoạt động trên các cá thể của các lớp con đó, và nếu hành vi của thuật toán thay đổi một chút tùy thuộc vào trường hợp cụ thể của lớp con, thì cách hướng đối tượng thông thường nhất để thực hiện điều này đang sử dụng các phương pháp ảo. Ví dụ nếu các lớp con là nút DOM, và nếu thuật toán chèn một nút con, thuật toán đó khác nhau tùy thuộc vào liệu nút cha là phần tử DOM (có thể có con) hay văn bản DOM (có thể ' t): và do đó phương thức insertChildren
có thể là ảo (hoặc trừu tượng) trong lớp cơ sở DomNode
và được triển khai khác nhau trong mỗi lớp con DomElement
và DomText
.Khi nào sử dụng thông tin loại thời gian chạy?
Một khả năng khác là cung cấp cho các cá thể một thuộc tính chung, có giá trị có thể được đọc: ví dụ: thuật toán có thể đọc thuộc tính nodeType
của lớp cơ sở DomNode
; hoặc cho một ví dụ khác, bạn có thể có các kiểu khác nhau (các lớp con) của gói mạng, chia sẻ một tiêu đề gói chung, và bạn có thể đọc tiêu đề gói để xem loại gói đó là gì.
tôi đã không sử dụng thông tin thời gian chạy kiểu nhiều, bao gồm:
- Các
is
vàas
từ khóa trong C# - downcasting
- Phương pháp Object.GetType trong dot net
- Nhà điều hành
typeid
trong C++
Khi tôi thêm thuật toán mới m phụ thuộc vào loại phân lớp, tôi có xu hướng thay vào đó để thêm một phương thức ảo mới vào phân cấp lớp.
Câu hỏi của tôi là, khi nào thích hợp để sử dụng thông tin kiểu thời gian chạy, thay vì các chức năng ảo?
Lý do để nói rằng RTTI không được dùng nữa, phương pháp cuối cùng là gì? – ChrisW
@ChrisW, Nó chỉ khó hiểu và chậm hơn nhiều để thực thi. Nó không phải là không được chấp nhận, nó chỉ là phương pháp khác là tốt hơn :) – vava
Có rất ít lý do để nó được chậm hơn: RTTI có thể được lưu trữ trong lớp vtable, giống như một con trỏ hàm ảo. Tôi không chắc tại sao nó khó hiểu hơn, bởi vì theo cách kiểm tra RTTI là địa phương hơn: ví dụ nếu bạn thấy "if (foo is Foo)" thì bạn biết những gì đang được kiểm tra, mà không đi và nhìn vào các định nghĩa của các hàm ảo trong một số lớp con. – ChrisW