2013-07-16 34 views
9

Sự khác biệt giữa Mô-đun và Lớp trong OCaml là gì.Mô-đun và Lớp học trong OCaml

Từ tìm kiếm của tôi, tôi thấy điều này:

Cả hai cung cấp cơ chế cho sự trừu tượng và đóng gói, cho subtyping (bằng cách bỏ qua phương pháp trong các đối tượng, và bỏ qua ruộng trong module), và cho thừa kế (đối tượng sử dụng kế thừa; các mô-đun sử dụng bao gồm). Tuy nhiên, hai hệ thống không thể so sánh được. Một mặt, các đối tượng có lợi thế: các đối tượng là các giá trị đầu tiên là và các mô-đun không nói cách khác, các mô-đun không hỗ trợ tra cứu động . Mặt khác, các mô-đun có lợi thế: các mô-đun có thể chứa các loại định dạng và các đối tượng không thể.

Trước tiên, tôi không hiểu "Mô-đun không hỗ trợ tra cứu động" nghĩa là gì. Từ phần của tôi, trừu tượng và đa hình có nghĩa là con trỏ cha mẹ có thể tham chiếu đến một cá thể con. Đó có phải là "tra cứu động" không? Nếu không, tra cứu động thực sự có nghĩa là gì?

Trong thực tế, khi nào chúng ta chọn sử dụng Mô-đun và khi nào?

Trả lời

8

Từ quan điểm thực tế, tìm kiếm động cho phép bạn có các đối tượng khác nhau với cùng phương thức mà không chỉ rõ lớp/mô-đun thuộc về nó. Nó giúp bạn khi sử dụng thừa kế. Ví dụ:

Ví dụ: cho phép sử dụng hai cấu trúc dữ liệu: SingleListDoubleLinkedList, cả hai, được kế thừa từ List và có phương thức pop. Mỗi lớp đều có phương pháp thực hiện riêng của phương thức đó (vì 'ghi đè').

Vì vậy, khi bạn muốn gọi, tra cứu phương pháp được thực hiện khi chạy (a.k.a. động) khi bạn thực hiện list#pop.

Nếu bạn đang sử dụng các mô-đun, bạn sẽ phải sử dụng SingleList.pop list hoặc DoubleLinkedList.pop list.

EDIT: Như @ Majestic12 cho biết, phần lớn thời gian, người dùng OCaml có xu hướng sử dụng mô-đun trên các lớp học. Sử dụng thứ hai khi họ cần thừa kế hoặc trường hợp (kiểm tra câu trả lời của mình).

Tôi muốn mô tả thực tế như bạn có vẻ mới đối với OCaml.

Hy vọng nó có thể giúp bạn.

11

Sự khác biệt chính giữa Mô-đun và Lớp học là bạn không khởi tạo mô-đun.

Mô-đun cơ bản chỉ là một "ngăn kéo", nơi bạn có thể đặt các loại, chức năng, các mô-đun khác, v.v ... Chỉ ở đây để đặt mã của bạn. Ngăn kéo này tuy nhiên thực sự mạnh mẽ nhờ các functors.

Một lớp học, mặt khác, tồn tại để được khởi tạo. Chúng chứa các biến và phương thức. Bạn có thể tạo một đối tượng từ một lớp, và mỗi đối tượng chứa biến và phương thức riêng của nó (như được định nghĩa trong lớp).

Trong thực tế, việc sử dụng một mô-đun sẽ là một giải pháp tốt hầu hết thời gian. Một lớp có thể hữu ích khi bạn cần thừa kế (các widget chẳng hạn).