2016-05-20 24 views
8

Tôi đã thiết kế một nhà cung cấp loại đơn giản cung cấp các loại tùy thuộc vào thông số của tôi. Tôi muốn biết nếu nó có thể xác định GivenTypeDefinitions mà sẽ kế thừa một GivenTypeDefinition khác?f # type thừa kế nhà cung cấp

Tôi biết rằng tĩnh tôi có thể làm như sau:

type People() = class end 

type Student() = 
    inherit People() 

type Teacher() = 
    inherit People() 

và sau đó tôi có thể mô hình trận đấu như thế này sử dụng Loại Kiểm tra mẫu:

let f (x:People) = 
    match x with 
     | :? Student -> "Student" 
     | :? Teacher -> "Teacher" 
     | _ -> "Nothing !!" 

Những gì tôi muốn làm trong Loại của tôi nhà cung cấp là tạo ra GivenTypeDefinitions kế thừa một ProvisionTypeDefinition khác. Như vậy khi tôi sử dụng nhà cung cấp kiểu để tạo ra các kiểu mà tôi có thể khớp mẫu trên chúng (ví dụ, tôi biết rằng khi chạy một trong các kiểu này sẽ được instanciated nhưng tôi không biết cái nào ngoại trừ nó là một trong những ProvisionTypeDefinitions).

Cảm ơn bạn đã dành thời gian!

Trả lời

1

Hãy thử sử dụng một liên minh phân biệt đối xử đối với mô hình phù hợp thay vì thừa kế

type Occupation = 
    | Student 
    | Teacher 

type People(occupation) = 
    member this.Occupation = occupation 
class end 

type Student() = 
    inherit People(Student) 

type Teacher() = 
    inherit People(Teacher) 

let findPerson (person : People) = 
    match person.Occupation with 
    | Student -> "Student" 
    | Teacher -> "Teacher" 

Cá nhân tôi muốn tránh sử dụng đối tượng thừa kế trong fsharp do upcasting and downcasting. Ví dụ:

let person = new Student() :> People 
findPerson person 

Thay vào đó, tôi khuyên bạn nên loại bỏ phân tích Sinh viên và giáo viên và cho phép mọi người xử lý logic nghề nghiệp.

type Occupation = 
    | Student 
    | Teacher 

type People(occupation) = 
    member this.Occupation = occupation 
class end 

let findPerson (person : People) = 
    match person.Occupation with 
    | Student -> "Student" 
    | Teacher -> "Teacher" 

People Student 
|> findPerson 
|> printfn "%s" 
+0

Cảm ơn sự giúp đỡ của bạn :). Vấn đề với giải pháp này là TP không cung cấp DU hoặc Hồ sơ. Tôi sẽ không thể cung cấp loại 'Occupation' mà bạn đã mô tả. – Leleutch

+0

Hi Leleutch, Tôi đã chỉnh sửa câu trả lời của mình để phù hợp với loại kiềm chế –

0

Thừa kế giữa các loại được cung cấp là khá khó. Bạn có thể đọc số article này để có ý tưởng về cách bạn có thể làm điều này, nhưng ngay cả trong đó bạn sẽ thấy rằng tác giả có rất ít thành công bất chấp những nỗ lực tốt nhất của mình. Dường như việc thực hiện cơ chế cung cấp kiểu hiện tại không phải là rất có sức chứa đối với việc kế thừa các loại được cung cấp từ các loại được cung cấp khác.

Đề xuất của tôi cho bạn đơn giản hơn nhiều, chỉ cần sử dụng active patterns và bạn sẽ có thể khớp với bất kỳ thứ gì bạn muốn.

Chỉnh sửa: thực tế là bạn thậm chí không cần phải sử dụng các mẫu đang hoạt động, vì bạn vẫn có thể khớp mẫu trên loại.

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