Tại sao C # không hỗ trợ nhiều kế thừa?


10

Ngay cả khi đó có thể là những thực tiễn xấu, tôi sẽ nói rằng có thời gian nó sẽ hoàn thành mục đích của nó.


1
Tôi chỉ thích cách mọi người đưa ra tất cả những lý do này cho việc không có khả năng hoàn toàn hữu ích trong bất kỳ thứ gì Microsoft sản xuất (MVP đặc biệt tinh thông về điều này). Tôi đoán là hầu hết những người không hiểu về lợi ích của việc thừa kế nhiều người là những người không hiểu (và không sử dụng) quyền thừa kế ở nơi đầu tiên, bởi vì họ thích bản sao và phổ biến hơn bao giờ hết paste-the-code-20 lần mà tôi thấy trong hầu hết các dự án ở mọi nơi. Không còn nghi ngờ gì nữa và khi Microsoft quyết định thực hiện MI, mọi người sẽ đột nhiên trở thành một người say mê, không cần chờ đợi một "nhà truyền giáo", tuyên bố với

1
@DaveZiffer có lẽ, nhưng có vẻ khó để có được đúng. Bạn có biết một ngôn ngữ hoặc cách thực hiện nơi nó hoạt động thực sự tốt không?

4
@Dave Hoặc bạn chỉ đánh giá quá cao tính hữu dụng của nó. Kế thừa nói chung là cách đánh giá quá cao, và các trường hợp thiếu có thể dễ dàng được mô hình hóa bằng cách sử dụng các giao diện và thành phần. Nhiều kế thừa thực sự là vô dụng trong C #. Ưu điểm duy nhất có được là nó không cần phải ủy quyền thủ công các phương thức giao diện cho việc triển khai trong các thành viên hỗn hợp. Điều này có thể đã được giải quyết tốt hơn (ví dụ bằng cách giới thiệu mixins) nhưng không có lý do chính đáng nào để giới thiệu nhiều kế thừa.
Konrad Rudolph

Tôi đã mã hóa OO trong java trong nhiều năm nay bằng cách sử dụng tính kế thừa hợp lý (đôi khi rất ít khi tôi học tốt hơn) và tôi đã tìm thấy chính xác 1 lần khi rất khó để có được sự kế thừa nhiều lần và có thể 10 lần nơi tôi có thể đã sử dụng nó để đơn giản hóa thiết kế hiện tại của mình - và chính xác là 0 lần khi tôi không thể thiết kế lại nó không cần nhiều sự kế thừa và có thiết kế tổng thể tốt hơn so với nó.
Bill K

Câu trả lời:


14

/programming/995255/why-is-multipl-inherribution-not-allowed-in-java-or-c bao gồm câu hỏi này độc đáo.

Tôi coi đó là điều này: Các nhà thiết kế có thể muốn tạo ra một ngôn ngữ thúc đẩy các nguyên tắc thiết kế tốt. Ok, vì vậy có nhiều thời điểm mà nhiều kế thừa là hoàn hảo. Tuy nhiên, đó là những ngoại lệ, thay vì quy tắc và có thể bị lạm dụng rất dễ dàng. Vì vậy, các nhà thiết kế quyết định làm cho nó không thể làm được.

Đối với những trường hợp sẽ tốt, bạn cần sử dụng giao diện. Những công việc đó, mặc dù vụng về; nhưng, bạn sẽ không cần chúng cho điều đó nhiều.


8

Chỉ để minh họa tại sao không, nhiều kế thừa được C ++ hỗ trợ, nhưng không được khuyến khích mạnh mẽ vì bạn có thể hoàn thành hầu hết mọi thứ với bố cục mà bạn sẽ làm với MI, tuy nhiên theo cách sạch sẽ hơn nhiều. Không giống như C ++, C # không phải là ngôn ngữ OOP "lai", tức là nó không phát triển từ ngôn ngữ trước.

Nếu bạn thực sự cần nhiều kế thừa, bạn có thể thực hiện nhiều giao diện.


6

Walter Bright vừa là người tạo ra D, không bao gồm MI, và là người duy nhất tự mình viết toàn bộ trình biên dịch C ++. Theo ông, lý do D thiếu MI là vì quá khó để tạo ra một hệ thống MI đồng thời hiệu quả, đơn giản và hữu ích. Tôi nghi ngờ Java và C # sử dụng lý do tương tự. Các ngôn ngữ như Perl và Python không có hiệu quả là mục tiêu chính, vì vậy chúng có một hệ thống đơn giản và hữu ích, nhưng khó thực hiện hiệu quả. C ++ dường như không có sự đơn giản như một mục tiêu, vì vậy nó đã tạo ra một hệ thống phức tạp ồ ạt mà hầu như không ai hiểu được.

Tôi nghĩ Walter là đúng mục tiêu. Nếu có bất kỳ ngôn ngữ nào có hệ thống MI thỏa mãn cả ba tiêu chí này một cách hợp lý, vui lòng để lại nhận xét.


2
Bạn nghĩ gì về Eiffel, Common Lisp và Dylan? Tôi biết rằng cả ba đều đơn giản và hữu ích. Và tôi biết rằng cả Common Lisp và Dylan đều có thể cạnh tranh và thậm chí đánh bại C ++ (và thường là C) về hiệu suất, do đó dường như đáp ứng hiệu quả. Tôi làm biết rằng Eiffel trình biên dịch là khủng khiếp chậm nhưng tôi biết bên cạnh không có gì về hiệu suất của các mã biên dịch nó tạo ra.
Jörg W Mittag


-1

Bởi vì các nhà thiết kế ngôn ngữ dường như muốn tạo ra một C ++ tốt hơn, nói chung không phải là một ngôn ngữ tốt hơn. (Làm thế nào thành công họ có thể được tranh luận.)

Đa kế thừa kiểu C ++ có một số vấn đề và do đó mọi người xuất phát từ C ++ thường bỏ qua nó (Java, C #, D). Các ngôn ngữ khác, Eiffel và Common Lisp để đặt tên cho hai, làm điều đó khác đi và dường như không có cùng một vấn đề.

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.