Kế thừa khác với phân nhóm như thế nào?


15

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ì?


6
Tôi tự hỏi nếu câu hỏi này (và những câu hỏi khác giống như vậy) có thể được chuyển hướng đến trang web cs.SE mới khi nó vào phiên bản beta công khai không?
Suresh Venkat

1
Chào mừng bạn đến với cstheory, một trang web hỏi đáp cho các câu hỏi ở cấp độ nghiên cứu trong khoa học máy tính lý thuyết (TCS). Câu hỏi của bạn dường như không phải là một câu hỏi cấp độ nghiên cứu trong TCS. Vui lòng xem Câu hỏi thường gặp để biết thêm thông tin về ý nghĩa của điều này và đề xuất cho các trang web có thể chào đón câu hỏi của bạn. Cuối cùng, nếu câu hỏi của bạn bị đóng vì nằm ngoài phạm vi và bạn tin rằng bạn có thể chỉnh sửa câu hỏi để biến nó thành câu hỏi ở cấp độ nghiên cứu, xin vui lòng làm như vậy. Đóng không phải là vĩnh viễn và câu hỏi có thể được mở lại, kiểm tra Câu hỏi thường gặp để biết thêm thông tin.
Kaveh

3
@UdayReddy: Không có câu hỏi nào là không tầm thường khi lần đầu tiên được trả lời, nhưng chúng ta nên đưa ra quyết định theo quan điểm hiện đại. Lập luận tương tự như của bạn sẽ ám chỉ rằng câu hỏi về thuật toán của Dijkstra là về chủ đề bởi vì bài báo đầu tiên nói về nó và không có gì khác.
Tsuyoshi Ito

3
@TsuyoshiIto Sự tương tự là không phù hợp vì bài báo đầu tiên của Dijkstra đã giải quyết vấn đề trong khi bài báo đầu tiên của Cardelli ở đây tạo ra vấn đề. Tuy nhiên, tôi cho rằng chúng ta không đo lường trạng thái của nghệ thuật dựa trên bài báo đầu tiên. Hãy để tôi đảm bảo với bạn rằng sự khác biệt giữa thừa kế và phân nhóm không đại diện cho một vấn đề đã được giải quyết và tôi dự đoán rằng vấn đề này sẽ được tranh luận ít nhất 20 năm nữa. Người hỏi có thể được khuyên làm một số bài tập về nhà bổ sung và chỉnh sửa câu hỏi để làm rõ các vấn đề ở cấp độ nghiên cứu.
Uday Reddy

3
Trong mọi trường hợp, thật dễ dàng để chỉ cho OP cùng với giấy của Cook và cộng sự: citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.102.8635
Andreas Rossberg

Câu trả lời:


18

[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.]

MộtBMộtBMộtB

MộtB

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.


1
Có lẽ cũng cần đề cập rằng có những ngôn ngữ thực tế ngoài kia đã tách thành công phân nhóm từ thừa kế, ví dụ Ocaml trong hệ thống đối tượng của nó.
Andreas Rossberg

@AndreasRossberg Thật vậy, OCaml không có trong khung của tôi khi tôi viết câu trả lời đó. Tôi cho rằng OCaml hoàn toàn không có phân nhóm danh nghĩa. Vì vậy, một số trong những vấn đề này sẽ không phát sinh. Nhưng có khả năng các loại có thể vô tình khớp ngay cả khi hành vi đó không xảy ra và hệ thống loại sẽ không thể giúp bắt lỗi từ loại đó.
Uday Reddy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.