Sunrabbit

Biến thể đồng biến và phản biến

  • Ngôn ngữ viết: Tiếng Hàn Quốc
  • Quốc gia: Tất cả các quốc giacountry-flag
  • CNTT

Đã viết: 2024-11-01

Đã viết: 2024-11-01 01:06

Nội dung này thường gặp nếu bạn là nhà phát triển trình biên dịch, sử dụng API của trình biên dịch hoặc sử dụng hệ thống kiểu dữ liệu của trình biên dịch quá mức.
Điều này thường xuyên xuất hiện trong quá trình lập trình của chúng ta.

Nó được tích hợp một cách tự nhiên vào cuộc sống lập trình của chúng ta.


Một cách đơn giản, nếu có hai kiểu dữ liệu Animal và Dog,

nếu Dog được gán cho Animal thì đó được gọi làsự đồng biến (Covariance)

ngược lạinếu Animal được gán cho Dog thì đó được gọi làsự phản đồng biến (Contravariance) .

Thông thường, Animal không thể được gán cho Dog.

Bởi vì điều đó không hợp lý trong mắt người bình thường,
vì vậy các nhà phát triển trình biên dịch đã cân nhắc điều này và chỉ đưa sự phản đồng biến vàomột số phầncụ thể.


Thông thường, sự phản đồng biến được sử dụng cho các giá trị đầu vào của hàm, trong khi đó các giá trị đầu ra vẫn duy trì sự đồng biến.


Tại sao sự phản đồng biến lại cần thiết?Bạn có thể tự hỏi.

Điều này giúp cho việc xử lý sự kiện linh hoạt hơn và duy trì tính đa hình.

Ngược lại, sự đồng biến lại có thể gây ra vấn đề.


Trong đoạn mã trên, Animal được sử dụng thay cho Dog để tăng tính linh hoạt và chú trọng đến tính đa hình.

Nếu thay vì Animal mà là Chiwawa, một kiểu dữ liệu con của Dog, thì khi gọi hàm xử lý sự kiện, sẽ xảy ra lỗi vì Dog không có các thuộc tính riêng của Chiwawa.


Thay vào đó, ta có thể hiểu là hàm này sẽ sử dụng kiểu dữ liệu Animal, và bất kì kiểu dữ liệu con nào của Animal cũng có thể được sử dụng.

Điều này có thể tạo cảm giác giống như Dog được gán cho Animal.


Như vậy, sự phản đồng biến thường được sử dụng cho các giá trị đầu vào.


Biến thể (Variance) và bất biến (Invariance)


Tóm lại, biến thể cho phép cả đồng biến và phản đồng biến, trong khi bất biến không cho phép cả hai.

Kết luận

Đây là một chủ đề đơn giản nhưng cũng có thể phức tạp,

Vì vậy, bạn nên đọc thêm tài liệu này.




Bình luận0