Trong quan điểm ngôn ngữ lập trình, ý nghĩa của việc phân nhóm là gì? Tôi nghe nói rằng "Thừa kế không phải là Subtyping". Vậy thì sự khác biệt giữa thừa kế và phân nhóm là gì?
Trong quan điểm ngôn ngữ lập trình, ý nghĩa của việc phân nhóm là gì? Tôi nghe nói rằng "Thừa kế không phải là Subtyping". Vậy thì sự khác biệt giữa thừa kế và phân nhóm là gì?
Câu trả lời:
[Tôi chưa suy nghĩ sâu sắc về các vấn đề của các hệ thống hướng đối tượng, nhưng tôi sẽ nói những gì tôi biết để thảo luận.]
Phân nhóm cấu trúc không đảm bảo phân nhóm hành vi vì cấu trúc của một loại có thể phù hợp vì lý do tình cờ. Tuy nhiên, việc xác định hành vi dự kiến là không dễ dàng. Vì vậy, nhiều ngôn ngữ lập trình sử dụng một điểm trung gian, trong đó người dùng phải khai báo loại nào là kiểu con trong đó. Điều này được gọi là "phân nhóm danh nghĩa" . Xem câu hỏi về ẩn phụ và phân nhóm rõ ràngcho một cuộc thảo luận về vấn đề này. Ý tưởng là lập trình viên phải đảm bảo phân nhóm hành vi cho tất cả các kiểu con được khai báo bằng sự khéo léo của chính mình. Ngôn ngữ không thể cung cấp bất kỳ trợ giúp. Tuy nhiên, tất cả các kiểu con được khai báo phải ít nhất là các kiểu con cấu trúc. Nếu không, chương trình sẽ không gõ kiểm tra. Ngôn ngữ có thể giúp đảm bảo điều này. (Một số ngôn ngữ lập trình không có hệ thống loại đủ tốt để đảm bảo điều này vào thời gian biên dịch. Nếu vậy, lỗi loại sẽ được phát hiện trong thời gian chạy hoặc có thể tạo ra kết quả sai. Rõ ràng các lỗ hổng như vậy là không mong muốn.)
Khi xác định các lớp con trong các chương trình hướng đối tượng, người ta thường thêm các trường (hoặc phương thức) hiển thị công khai. Trong hầu hết các ngôn ngữ lập trình, các lớp con như vậy được coi là các kiểu con danh nghĩa . Câu hỏi là liệu chúng cũng là kiểu con cấu trúc . Nếu chúng không phải, tức là, ngôn ngữ lập trình cho phép người ta khai báo các kiểu con danh nghĩa không phải là kiểu con cấu trúc, thì sẽ có các lỗ loại trong ngôn ngữ lập trình.
Trong trường hợp đơn giản, thêm các lĩnh vực hoạt động tốt. Loại siêu lớp dự kiến sẽ có ít trường hơn loại của lớp con. Vì vậy, nếu bạn cắm vào một thể hiện của một lớp con trong đó một thể hiện của lớp suepr được mong đợi, chương trình sẽ chỉ bỏ qua các trường bổ sung được cung cấp và không có gì sai.
Tuy nhiên, nếu siêu lớp hoặc lớp con có các phương thức lấy các đối số cùng loại với chính nó hoặc trả về kết quả cùng loại với chính nó, thì sẽ nảy sinh vấn đề. Sau đó, kiểu giao diện của lớp con không phải là kiểu con cấu trúc của lớp siêu lớp. Các ngôn ngữ lập trình an toàn kiểu được sử dụng rộng rãi như Java không cho phép các lớp con như vậy. Vì vậy, họ hạn chế ngôn ngữ để có được loại an toàn. Ngôn ngữ lập trình Eiffel được cho là đã hy sinh loại an toàn để có được sự linh hoạt thay thế. Nếu người ta thiết kế một hệ thống loại mạnh mà vẫn giữ được tính linh hoạt, thì người ta phải từ bỏ nguyên tắc các lớp con làm phát sinh các kiểu con. Do đó, tiêu đề của bài báo "Kế thừa không phải là phân nhóm". Các tác giả đề xuất một khái niệm khác về phân nhóm bậc cao hơn hoạt động thay thế. Kim Bruce cũng có một đề xuất liên quan chặt chẽ gọi là "kết hợp" đạt được hiệu quả tương tự. Xem bài trình bày này . Cũng hữu ích là một vị trí của Andrew Black.
Cộng đồng ngữ nghĩa có lẽ có lỗi vì phần lớn bỏ qua vấn đề. Theo truyền thống, chúng tôi coi nó như là một vấn đề kỹ thuật hệ thống loại thực tế ít được quan tâm về mặt lý thuyết. Nếu đó không phải là trường hợp và thực sự có một số ngữ nghĩa hoạt động trong khu vực, tôi hy vọng những người khác sẽ đề cập đến chúng.