2013-06-13 48 views
7

câu hỏi của tôi liên quan đến cách làm thế nào để đối phó với thừa kế theo cách chức năng trong F #. Để mô tả nó một chút, tôi đưa ra một ví dụ đơn giản. Giả sử chúng ta muốn mô hình hóa một thế giới bao gồm nhiều loại động vật khác nhau. Mỗi loại động vật chia sẻ một số thuộc tính với các loại khác (ví dụ: tên, kích thước, v.v.). Ngoài ra, mỗi loại có thể có loại khác, không được chia sẻ bởi những người khác (ví dụ: số lượng trẻ em có liên quan đến chó và mèo, tuy nhiên, không phải đối với nhện). Ngoài ra, có thể có các phương pháp hoặc chức năng liên quan đến từng loại động vật có thể hoặc có thể không giống nhau đối với hai loại động vật, tức là có triển khai mặc định có thể bị chi trả cho một loại cụ thể. Mỗi loại động vật có thể có (các) phương pháp chỉ được định nghĩa cho loại đó.F # và mô hình của thừa kế

Bây giờ, trong thế giới OOP, điều này có thể dẫn đến một lớp trừu tượng có các thuộc tính chung và các phương thức trừu tượng tiếp theo là các lớp bắt nguồn cho từng loại động vật. Điều tôi không chắc chắn là cách chỉ định mô hình miền có chức năng trong F #. Ở đây: Which to use , abstract class or interface in F#? được tuyên bố rằng "mã F # thành ngữ sử dụng các điểm mở rộng khác với C# (ví dụ: lấy hàm/giao diện làm đối số), vì vậy bạn không thực sự cần lớp trừu tượng".

Nếu đây là cách được chấp nhận, có thể cung cấp một số ví dụ cơ bản về điều này không?

Để tiếp tục suy nghĩ về điều này, tôi cho rằng các thuộc tính nên được đóng gói trong một số cấu trúc. Sau đó, cấu trúc thành ngữ nhất trong khía cạnh này trong F # là bản ghi. Điều đó có nghĩa là phải có một bản ghi cha, sẽ được bao gồm trong các hồ sơ khác tương ứng với "trẻ em" cụ thể, tức là thành phần thay vì thừa kế. Tuy nhiên điều này dường như với tôi như một cách giải quyết không phải là thành ngữ hay đặc biệt thanh lịch.

Tôi nghĩ cách ưa thích cách mô hình kế thừa trong F # là các công đoàn phân biệt đối xử. Tuy nhiên, điều này không giải quyết được vấn đề thuộc tính và phương thức được chia sẻ.

Các mô hình tương tự như mô hình được đề cập ở trên, khá thường xuyên trong quan điểm của tôi, vì được bao gồm hoàn toàn trong hầu hết các ứng dụng doanh nghiệp. Vì vậy, có bất kỳ đề nghị làm thế nào điều này có thể được xử lý theo cách chức năng (ví dụ như cách đề nghị theo liên kết ở trên hoặc bất kỳ đề nghị khác)? Hay chúng ta sẽ nói rằng đây không phải là một miền có thể dễ dàng được mô hình hoá bằng cách sử dụng phương pháp tiếp cận chức năng?

Cảm ơn bạn.

Trả lời

9

Mô tả của bạn về ví dụ đã đặt trước mô hình lập trình hướng đối tượng. Bạn đang mô tả vấn đề trong các thuật ngữ hướng đối tượng như ghi đè và các phương thức được xác định cho một số loại động vật nhất định. Điều này làm cho nó khó khăn để cung cấp cho bạn một đại diện chức năng thay thế hợp lý, bởi vì câu hỏi của bạn đã giả định các khái niệm hướng đối tượng trong câu trả lời. Đầu tiên, nó là hoàn toàn tốt để sử dụng các cấu trúc hướng đối tượng trong F # khi chúng có ý nghĩa (ví dụ trong câu hỏi của bạn chỉ là một mẫu đồ chơi, vì vậy điều này có thể hoặc có thể không phải là trường hợp). Ý tưởng quan trọng là F # thích sáng tác hơn thừa kế và vì vậy bạn có thể cố gắng tránh kế thừa (có thể dẫn đến các hệ thống phân cấp đối tượng phức tạp) và thay vào đó soạn các con vật từ các khía cạnh khác nhau.

Thứ hai, nếu bạn giải thích vấn đề của mình theo một cách khác, thì có thể có đại diện chức năng hoàn hảo bằng cách sử dụng các công đoàn phân biệt đối xử. Ví dụ:

type MammalKind = Cat | Dog 
type MammalInfo = { Legs : int; Children : int } 

type Animal = 
    | Mammal of MammalKind * MammalInfo 
    | Spider of (...) 

Ý tưởng sẽ là cấu trúc loại để các loại động vật khác nhau (mà bạn có thể xử lý theo một cách khác) có loại riêng của chúng.Ví dụ, bạn có thể viết một hàm mất MammalInfo và thực hiện một số tính toán chỉ có ý nghĩa đối với chó và mèo (nhưng không phải cho nhện). Nhưng như tôi đã đề cập trước đó, mô tả của bạn về vấn đề này vốn đã hướng đối tượng, vì vậy có thể khó khăn để xem việc này sẽ được thực hiện như thế nào.

+0

Câu hỏi hay, câu trả lời hay! – mydogisbox

+0

Câu trả lời của Tomas Petricek là câu trả lời hay nhất. Tôi cũng muốn giới thiệu câu trả lời sau đây của Norman Ramsey: http://stackoverflow.com/a/2079678/631115. – Shredderroy

+0

Tomas, cảm ơn bạn vì ví dụ. Nó đẹp và đơn giản. Về mô tả tôi đã đưa ra, tôi đã cố gắng phân biệt rõ ràng giữa mô tả và triển khai có thể có (lớp trừu tượng). Tôi tự hỏi liệu các chức năng phổ biến (ví dụ: chức năng trả về tên của động vật theo một số cách thú vị cho tất cả động vật hoặc một số hệ số con cho tất cả các động vật có vú) là một phần của các loại cụ thể (AnimalInfo-which will yet yet created- và MammalInfo) là thành viên của nó hoặc cho dù khai báo chúng một cách tự do (không được chỉ định). Tôi cũng nghĩ rằng đó là một câu hỏi tổng quát hơn không được kết nối độc quyền với bố cục kiểu. – user2039784

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