Nói chung, hiệp phương sai cho phép bạn thể hiện nhiều thông tin hơn trong giao diện lớp dẫn xuất hơn là đúng trong giao diện lớp cơ sở. Hành vi của một lớp dẫn xuất là cụ thể hơn so với một lớp cơ sở, và hiệp phương sai biểu thị (một khía cạnh) sự khác biệt.
Tính năng này hữu ích khi bạn có phân cấp liên quan đến gubbins, trong trường hợp một số khách hàng muốn sử dụng giao diện lớp cơ sở, nhưng các ứng dụng khách khác sẽ sử dụng giao diện lớp dẫn xuất.Với const-đúng đắn bỏ qua:
class URI { /* stuff */ };
class HttpAddress : public URI {
bool hasQueryParam(string);
string &getQueryParam(string);
};
class Resource {
virtual URI &getIdentifier();
};
class WebPage : public Resource {
virtual HttpAddress &getIdentifier();
};
Clients mà biết họ có một WebPage (trình duyệt, có lẽ) biết rằng nó có ý nghĩa để nhìn vào params truy vấn. Khách hàng đang sử dụng lớp cơ sở tài nguyên không biết điều đó. Họ sẽ luôn ràng buộc trả lại HttpAddress&
thành số URI&
biến hoặc tạm thời.
Nếu họ nghi ngờ, nhưng không biết, đối tượng tài nguyên của họ có HttpAddress, thì họ có thể dynamic_cast
. Nhưng hiệp phương sai vượt trội hơn "chỉ cần biết" và làm diễn viên cho cùng một lý do mà gõ tĩnh là hữu ích cả.
Có các lựa chọn thay thế - gắn chức năng getQueryParam
trên URI
nhưng làm cho hasQueryParam
trả về false cho mọi thứ (làm lộn xộn giao diện URI). Để lại WebPage::getIdentifier
được xác định để trả lại URL&
, thực sự quay lại HttpIdentifier&
và yêu cầu người gọi thực hiện dynamic_cast
vô nghĩa (cắt mã gọi và tài liệu về WebPage nơi bạn nói "URL được trả về được đảm bảo tự động gán cho HttpAddress"). Thêm một hàm getHttpIdentifier
vào WebPage
(cắt giao diện WebPage
). Hoặc chỉ sử dụng hiệp phương sai cho những gì nó có nghĩa là để làm, đó là thể hiện một thực tế là một WebPage
không có FtpAddress
hoặc một MailtoAddress
, nó có một HttpAddress
.
Cuối cùng, tất nhiên, có một lý lẽ hợp lý rằng bạn không nên có thứ bậc của gubbins, hãy để một mình các phân cấp liên quan đến gubbins. Nhưng những lớp đó có thể dễ dàng là giao diện với các phương thức ảo thuần túy, vì vậy tôi không nghĩ nó ảnh hưởng đến tính hợp lệ của việc sử dụng hiệp phương sai.
Nguồn
2009-08-11 16:04:54
Khi tôi đọc câu hỏi, phản ứng của tôi giống hệt nhau. Vấn đề là gì - không sử dụng các loại trả về covariant! –