Ví dụ: nếu tôi có hai bản ghi khác nhau, nhưng chúng có chung một số trường phổ biến, có cách nào để tạo cả hai bản ghi chia sẻ bản ghi cơ bản chung không? Có vẻ như các giao thức chỉ cho phép khai báo chữ ký của phương thức.Có thể thực hiện kế thừa kiểu dữ liệu trong Clojure không?
Trả lời
Tôi không nghĩ điều đó có thể thực hiện từ bây giờ.
defrecord
chỉ là một vĩ mô và bạn có thể kiểm tra những gì nó làm bằng cách sử dụng macroexpand
, một cái gì đó như:
(macroexpand '(defrecord User [Name Age]))
Vì vậy, nếu bạn muốn thừa kế kỷ lục như vậy, bạn có thể cần phải thực hiện một macro để làm như vậy. Nhưng tôi sẽ không gợi ý rằng sự thừa kế là thứ mà tôi cố gắng tránh vì nó dẫn đến sự phức tạp.
Bạn nên lập trình dựa trên một trường trừu tượng, không phải là các trường cụ thể, tức là sử dụng giao thức để các bản ghi có thể chia sẻ một giao diện chung. Ví dụ: nếu tất cả các loại bản ghi của bạn cần phải trả lại thuộc tính 'chuỗi', thì hãy tạo giao thức bằng phương thức 'get-string' và mở rộng đó cho từng loại bản ghi.
(defprotocol SQL
(get-string [t]))
(defrecord Thing [name f1 f2]
SQL
(get-string [t] (str name)))
(defrecord AnotherThing [name f1 f2 f3 f4 blah]
SQL
(get-string [t] (str name)))
Nếu bạn thấy mình đang thực hiện cùng một phương thức giao thức cụ thể, bạn luôn có thể thực hiện và sử dụng nó như thực hiện trong từng loại bản ghi.
Nếu tôi muốn tạo bản ghi chia sẻ một số trường của bản ghi khác thì sao? như: (defrecord a [ba bc]) (defrecord b [ba bc bd] .. làm thế nào để đối phó với trường hợp như vậy? –
- 1. Thừa kế trong thiết kế cơ sở dữ liệu
- 2. Thừa kế trong kết nối dữ liệu
- 3. Có phải OOP & hoàn toàn tránh thừa kế thực hiện có thể không?
- 4. @PrePersist với quyền thừa kế thực thể
- 5. Thừa kế kiểu WPF
- 6. Có thành phần nào không thể thực hiện được thừa kế đó không?
- 7. Thừa kế tài liệu trong kế thừa lớp Python
- 8. thừa kế trong cơ sở dữ liệu tài liệu?
- 9. thể HTML iframe kế thừa css và javascript dữ liệu
- 10. Khuôn khổ thực thể 4 - Thừa kế
- 11. Bạn có thể thực hiện "math" trong các kiểu WPF bị ràng buộc bởi dữ liệu
- 12. Haskell lớp kế thừa kiểu
- 13. kiểu kế thừa từ kiểu mặc định
- 14. Thừa kế kiểu dáng trong Android
- 15. "kế thừa" kiểu chủ đề trong wpf
- 16. Các kiểu thiết kế cơ sở dữ liệu (hoặc kiểu chống mẫu) có tên không?
- 17. Cách tạo một thể hiện của HttpPostedFileBase (hoặc kiểu kế thừa của nó)
- 18. Bảng phân tách một loại thực thể được kế thừa?
- 19. Thực hiện các giao diện trong C++ với các lớp cụ thể kế thừa
- 20. C#: Thừa kế thừa kế
- 21. Có thể thừa kế nhiều lần trong VB .Net không?
- 22. Trong WCF, các lớp hợp đồng dữ liệu có thể kế thừa từ một lớp khác không?
- 23. Không thể truyền một lớp có nhiều thừa kế
- 24. Tôi có thể xác định yêu cầu giao diện/phụ thuộc/kế thừa kế thừa không?
- 25. Có thể phát hiện ngữ cảnh lớp trong một phương thức tĩnh được kế thừa không?
- 26. Kiểu trang trí văn bản kế thừa
- 27. Nguồn dữ liệu SSIS Excel - Có thể ghi đè các kiểu dữ liệu cột không?
- 28. thừa kế xác thực symfony2
- 29. Điều gì đó giống như kế thừa trong thiết kế cơ sở dữ liệu
- 30. Entity Framework: Thừa kế, thay đổi kiểu đối tượng
Hai thực thể đó chia sẻ một số trường không thực sự là lý do đủ để tạo mối quan hệ thừa kế giữa chúng. Có lẽ cung cấp một số kịch bản sử dụng ví dụ. –
Ví dụ, tôi đang sử dụng các bản ghi để biểu diễn các truy vấn SQL được phân tích cú pháp. Vì vậy, tôi có hồ sơ cho SELECT, UPDATE, INSERT, vv .. Họ chia sẻ một vài thuộc tính phổ biến, chẳng hạn như một 'chuỗi' tài sản. Khi tôi xử lý chúng bằng các hàm đa hình, tôi muốn được đảm bảo rằng tất cả chúng đều có một vài thuộc tính chung. – Chris
Bản ghi chỉ là bản đồ ưa thích, vì vậy tôi không rõ ý nghĩa của việc "đảm bảo tất cả chúng đều có một vài thuộc tính phổ biến". Tại sao bạn không thể gọi '(: string a-record)'? Ngoài ra, tập hợp các khóa mà bản ghi có thể có là một vấn đề khác với hành vi mà loại bê tông có thể diễn tả. Vấn đề thực tế là bạn đang cố gắng giải quyết? –