2013-06-03 35 views
21

Điểm tương đồng là gì & sự khác biệt giữa các đặc điểm, mixin và giao diện. Tôi đang cố gắng hiểu sâu hơn về các khái niệm này nhưng tôi không biết đủ ngôn ngữ lập trình để triển khai các tính năng này để thực sự hiểu được những điểm tương đồng và khác biệt.Đặc điểm so với giao diện so với Mixins?

Đối với mỗi đặc điểm, mixins và giao diện

  • gì là vấn đề được giải quyết?
  • Định nghĩa của khái niệm có phù hợp với các ngôn ngữ lập trình không?
  • Điểm tương đồng giữa nó và các điểm khác là gì?
  • sự khác biệt giữa nó và những thứ khác là gì?
+1

Scala chỉ có các đặc điểm (hỗn hợp và giao diện sẽ được bao gồm bởi các đặc điểm).Nhìn vào hồ sơ của bạn có vẻ như bạn có một nền Java. Bạn nên thử Scala, bạn sẽ thấy rằng các đặc điểm rất thuận tiện khi bạn muốn kết hợp trong một số việc thực hiện đó là trực giao với lớp hiện tại của bạn. Sẽ khó hơn khi bạn muốn xếp các đặc điểm. Xem http://www.artima.com/pins1ed/traits.html để biết thêm chi tiết. – huynhjl

+0

@ams: Hãy xem [answer] này (http://stackoverflow.com/a/23124968/33311). Có thể hữu ích ngay cả khi nó được gắn thẻ "groovy". – Lernkurve

Trả lời

10

Mỗi reference type trong Java, ngoại trừ Object, xuất phát từ một lớp đơn.

Nhân tiện, các lớp Java có thể thực hiện không hoặc nhiều giao diện.

Nói chung, giao diện là một hợp đồng mô tả các phương thức mà lớp triển khai buộc phải có, mặc dù không trực tiếp cung cấp triển khai.

Nói cách khác, một lớp Java có nghĩa vụ tuân thủ hợp đồng của nó và do đó cung cấp cho việc triển khai các chữ ký phương thức được cung cấp bởi các giao diện mà nó tuyên bố thực hiện.

Giao diện cấu thành loại. Vì vậy, bạn có thể chuyển các tham số và có các giá trị trả về từ các phương thức được khai báo dưới dạng các kiểu giao diện, yêu cầu theo cách đó các tham số và kiểu trả về thực hiện các phương thức cụ thể mà không nhất thiết phải cung cấp triển khai cụ thể cho chúng.

Điều này đặt cơ sở cho một số mẫu trừu tượng, ví dụ: dependency injection.

Riêng Scala có các đặc điểm. Các đặc điểm cung cấp cho bạn tất cả các tính năng của các giao diện Java, với sự khác biệt đáng kể là chúng có thể chứa các phương thức triển khai và các biến. Đặc điểm là một cách thông minh để triển khai các phương thức một lần và - bằng cách đó - phân phối các phương thức đó vào tất cả các lớp mở rộng đặc điểm. Giống như giao diện cho các lớp Java, bạn có thể kết hợp nhiều đặc điểm vào một lớp Scala.

Vì tôi không có nền Ruby, tuy nhiên, tôi sẽ chỉ cho bạn một đoạn trích từ David Pollak của "Beginning Scala" (amazon link):

Ruby có mixins, đó là bộ sưu tập các phương pháp có thể được trộn vào bất kỳ lớp nào. Vì Ruby không có kiểu gõ tĩnh và không có cách nào khai báo các kiểu tham số phương thức, nên không có cách hợp lý để sử dụng mixin để định nghĩa một hợp đồng như giao diện. Các mixin của Ruby cung cấp một cơ chế để soạn mã vào các lớp nhưng không phải là một cơ chế để xác định hoặc thực thi các kiểu tham số.

Giao diện có thể làm nhiều hơn được mô tả trong bài đăng này; vì chủ đề có thể rộng lớn, tôi khuyên bạn nên điều tra thêm trong mỗi một trong ba hướng, trong khi nếu bạn thậm chí có nền Java, Scala và do đó các đặc điểm là hợp lý để học.

+0

Bạn nên làm rõ rằng mọi loại * refererence * đều xuất phát từ Object. Các nguyên thủy thì không. Tôi sẽ xóa câu "Vì nó được nói rộng rãi trên Internet ..." hoặc cung cấp một số liên kết đến các bài viết nổi tiếng. – coltfred

+1

@coltfred: chỉnh sửa xong. –

+0

Tôi không đồng ý với Pollak, trước hết "không có cách hợp lý để sử dụng mixin để xác định hợp đồng như giao diện" - [hợp đồng là * chủ yếu * về * phương thức *] (https://www.eiffel.com/values/design -by-hợp đồng/giới thiệu /), do đó, nó. Thứ hai "không phải là một cơ chế để xác định hoặc thực thi các kiểu tham số" - Ruby sử dụng kiểu gõ vịt và đặt tên phương thức cho việc này. Xem [câu trả lời này để biết thêm] (http://stackoverflow.com/a/177127/335847) – iain

Các vấn đề liên quan