Có cách nào tốt hơn để lập mô hình dữ liệu trong F # để tránh cần không?Tại sao không có bộ sửa đổi truy cập được bảo vệ trong F #?
Trả lời
Trình sửa đổi protected
có thể khá rắc rối trong F #, vì bạn thường cần gọi các thành viên từ biểu thức lambda. Tuy nhiên, khi bạn làm điều đó, bạn không còn truy cập phương thức từ bên trong lớp nữa. Điều này cũng gây nhầm lẫn khi sử dụng các thành viên được bảo vệ được khai báo trong C# (xem ví dụ this SO question). Nếu bạn có thể khai báo một thành viên protected
, đoạn code sau có thể là đáng ngạc nhiên:
type Base() =
protected member x.Test(a) = a > 10
type Inherited() =
inherit Base()
member x.Filter(list) =
list |> List.filter (fun a -> x.Test(a))
Mã này sẽ không làm việc, bởi vì bạn đang gọi điện thoại Test
từ một hàm lambda (mà là một đối tượng khác với trường hợp hiện tại của Test
), vì vậy mã sẽ không hoạt động. Tôi nghĩ rằng đây là lý do chính để không hỗ trợ sửa đổi protected
trong F #.
Trong F #, bạn thường sử dụng thừa kế thực hiện (có nghĩa là kế thừa từ một lớp cơ sở) ít thường xuyên hơn trong C#, vì vậy bạn không nên cần protected
như thường lệ. Thay vào đó, nó thường được ưu tiên sử dụng các giao diện (trong mã F # hướng đối tượng) và các hàm bậc cao hơn (trong mã chức năng). Tuy nhiên, rất khó để nói làm thế nào để tránh sự cần thiết cho protected
nói chung (khác hơn là tránh việc thừa kế thực hiện). Bạn có một số ví dụ cụ thể thúc đẩy câu hỏi của bạn?
Để xem liệu F # có cho phép tạo mô hình dữ liệu tốt hơn hay không, các tệp chữ ký cho phép các quyết định tầm nhìn rõ ràng hơn internal
thực hiện trong C#, thường rất đẹp. Xem nhận xét của Brian here để được giải thích thêm một chút. Tuy nhiên, điều này độc lập với sự hỗ trợ (hoặc thiếu) cho protected
.
- 1. được bảo vệ nội bộ
- 2. Tại sao phương thức finalize() trong java.lang.Object được bảo vệ?
- 3. sự khác biệt giữa các bộ sửa đổi truy cập được bảo vệ và gói riêng tư trong Java?
- 4. Không thể truy cập thành viên được bảo vệ 'object.MemberwiseClone()'
- 5. Tại sao bảo vệ có thể được truy cập trong cùng một gói mà không thừa kế trong java?
- 6. ghi đè nội bộ được bảo vệ bằng bảo vệ!
- 7. Tại sao ngôn ngữ oop không có công cụ sửa đổi truy cập 'chỉ đọc'?
- 8. Java: truy cập được bảo vệ qua các gói
- 9. Tại sao một chức năng với công cụ sửa đổi được bảo vệ có thể bị ghi đè và truy cập mọi nơi?
- 10. Đảm bảo vệ sinh khi không sửa đổi
- 11. Tại sao nội bộ được bảo vệ không hạn chế hơn nội bộ?
- 12. chưa được khai báo. Có thể không truy cập được do mức bảo vệ
- 13. phương pháp Tại sao giao diện không thể có được bảo vệ
- 14. Cách truy cập trang được bảo vệ bởi htpasswd
- 15. Công cụ sửa đổi được bảo vệ có nghĩa là gì?
- 16. clone() đã được bảo vệ quyền truy cập tạo ra đối tượng công cộng bản sao()
- 17. Bảo vệ tệp KML không tải xuống hoặc truy cập
- 18. Lịch sử của các công cụ sửa đổi kiểm soát truy cập như công khai/riêng tư/được bảo vệ
- 19. Vi phạm Truy cập: Đã cố gắng đọc hoặc viết bộ nhớ được bảo vệ
- 20. Bảo vệ file PHP từ truy cập trực tiếp
- 21. Mercurial có thể được thực hiện để bảo vệ quyền truy cập tập tin?
- 22. Bảo vệ bộ nhớ không có MMU
- 23. Lỗi C# "không thể truy cập được do mức độ bảo vệ" trong hàm tạo
- 24. Tại sao Ninject không giải quyết các thuộc tính được bảo vệ trong lớp cơ sở?
- 25. Hiển thị "Nội bộ được bảo vệ" trong UML?
- 26. thuộc tính được bảo vệ nội bộ vẫn có thể truy cập từ một assembly khác nhau
- 27. Tại sao tất cả các tệp được ghi được bảo vệ và làm cách nào tôi có thể đăng ký?
- 28. Tại sao thành viên superclass được bảo vệ không thể được truy cập trong một hàm lớp con khi được chuyển làm đối số?
- 29. Công cụ sửa đổi truy cập C# chỉ hiển thị lớp trong không gian tên
- 30. Tôi có thể tạo phương thức có quyền truy cập Java được bảo vệ trong Scala không?
Điều này đúng, nhưng đó là một hiện vật thực hiện của trình biên dịch. Không có lý do cơ bản nào mà ngôn ngữ .NET giống như F # không thể tạo ra một lớp lồng nhau để đóng gói và có ngữ nghĩa dự định. – kvb
Giải thích tốt. Thật dễ dàng để quên đi các đối tượng mà trình biên dịch F # tạo ra để hỗ trợ lambdas và các cấu trúc chức năng khác. Tôi đang viết một ORM sẽ được sử dụng thường xuyên từ C#. Nó sử dụng một cái gì đó của một mô hình nhà cung cấp. Có một lớp Repository trừu tượng, có thể được mở rộng bởi SqlRepository, OracleRepository, vv Tôi muốn một phương thức được bảo vệ tải thông tin lược đồ cho một bảng. Bất kỳ ý tưởng của một cách tốt hơn để làm điều này? – Daniel
@kvb - Tôi cũng nghĩ như vậy. Có cách nào trình biên dịch có thể kiểm tra xem một thành viên được bảo vệ có đang được truy cập từ một lambda trong một lớp dẫn xuất không? – Daniel