Tôi không biết nguồn của bạn là gì cho tuyên bố rằng bạn nên thích những đặc điểm trên các lớp trừu tượng trong Scala, nhưng lại là một vài lý do không phải tới:
- Đặc điểm phức tạp Java tương thích. Nếu bạn có một đặc điểm với một đối tượng đồng hành, các phương thức gọi trên đối tượng đồng hành từ Java yêu cầu cú pháp
MyType$.MODULE$.myMethod
kỳ quái. Đây không phải là trường hợp cho các lớp trừu tượng với các đối tượng đồng hành, được thực hiện trên JVM như một lớp đơn với các phương thức tĩnh và ví dụ. Việc thực hiện một đặc điểm Scala với các phương thức cụ thể trong Java thậm chí còn khó chịu hơn.
- Thêm phương pháp có triển khai vào một đặc điểm breaks binary compatibility theo cách thêm các phương thức cụ thể vào lớp học.
- Các đặc điểm dẫn đến nhiều mã byte hơn và một số chi phí bổ sung liên quan đến việc sử dụng các phương thức giao nhận.
- Đặc điểm mạnh mẽ hơn, điều này rất tệ - nói chung bạn muốn sử dụng tính trừu tượng mạnh mẽ nhất để hoàn thành công việc. Nếu bạn không cần loại thừa kế mà họ hỗ trợ (và rất thường xuyên bạn không), tốt hơn là không có quyền truy cập vào nó.
Lý do cuối cùng là quan trọng nhất trong quan điểm của tôi. Ít nhất một vài vấn đề khác là might get fixed trong các phiên bản tương lai của Scala, nhưng nó sẽ vẫn là trường hợp mặc định cho các lớp sẽ hạn chế các chương trình của bạn theo cách (ít nhất là cho là) phù hợp với thiết kế tốt. Nếu bạn quyết định bạn thực sự thực sự muốn sức mạnh được cung cấp bởi các đặc điểm, họ vẫn sẽ ở đó, nhưng đó sẽ là một quyết định mà bạn đưa ra, chứ không phải thứ bạn vừa mới bỏ qua.
Vì vậy không, trong trường hợp không có thông tin khác, tôi khuyên bạn nên sử dụng một lớp trừu tượng (lý tưởng là một lớp niêm phong) và hai lớp cụ thể cung cấp triển khai.
Nguồn
2016-02-07 08:53:56
Là chú thích, cách tiếp cận của Scala để tuyến tính hóa _is_ một giải pháp thông minh cho "vấn đề" của đa thừa kế, và khi bạn cần nó hoạt động khá tốt (ngoại trừ một vài thứ như trường). Nhưng bạn không bao giờ nên sử dụng một cái gì đó chỉ vì nó thông minh. –
Cảm ơn, câu trả lời cho câu hỏi của tôi. Nguồn của tôi là https://www.safaribooksonline.com/library/view/scala-cookbook/9781449340292/ch04s13.html. Câu trả lời của bạn có ý nghĩa hơn mặc dù – kliew
Với Scala [2.12] (http://www.scala-lang.org/news/2.12.0) làm # 1-3 vẫn áp dụng vis-a-vis '" Một đặc điểm biên dịch trực tiếp một giao diện với các phương thức mặc định. Điều này cải thiện khả năng tương thích nhị phân và khả năng tương tác Java. "'? Tất nhiên # 4 là lý do đủ để chọn một 'lớp trừu tượng' trên một đặc điểm', tôi tin. @TravisBrown –