2016-05-20 10 views
8

मैंने एक साधारण प्रकार प्रदाता तैयार किया है जो मेरे पैरामीटर के आधार पर प्रकार प्रदान करता है। मैं जानना चाहता हूं कि प्रोविडड टाइप परिभाषाओं को परिभाषित करना संभव है जो किसी अन्य प्रोविडड टाइप परिभाषा का उत्तराधिकारी होगा?एफ # प्रकार प्रदाता विरासत

मुझे पता है कि स्थिर मैं क्या कर सकते हैं निम्नलिखित:

type People() = class end 

type Student() = 
    inherit People() 

type Teacher() = 
    inherit People() 

और उसके बाद मैं इस का उपयोग कर टाइप टेस्ट पैटर्न की तरह पैटर्न मैच कर सकते हैं:

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

मैं अपने प्रकार में करना चाहते हैं क्या प्रदाता प्रदाता टाइप टाइप परिभाषाएं बनाना है जो किसी अन्य प्रोविडड टाइप परिभाषा का उत्तराधिकारी है। इस तरह जब मैं उन प्रकारों को उत्पन्न करने के लिए प्रकार प्रदाता का उपयोग करता हूं, तो मैं उन पर पैटर्न मिलान कर सकता हूं (उदाहरण के लिए, मुझे पता है कि रनटाइम पर इस प्रकार में से एक को तत्काल किया जाएगा, लेकिन मुझे नहीं पता कि यह कौन सा है, यह प्रोविडड टाइप परिभाषाओं में से एक है)।

आपके समय के लिए धन्यवाद!

उत्तर

1

विरासत

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" 

के बजाय मिलान पैटर्न के लिए एक साथ भेदभाव संघ का उपयोग करके देखें मैं व्यक्तिगत रूप से upcasting and downcasting के कारण fsharp में वस्तु वंशानुक्रम का उपयोग से बचने के लिए पसंद करते हैं। उदाहरण के लिए,

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

इसके बजाय मैं छात्र और शिक्षक पार्स से छुटकारा पाने की सलाह देता हूं और लोगों को व्यवसाय तर्क को संभालने देता हूं।

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

आपकी मदद के लिए धन्यवाद :)। इस समाधान के साथ मुद्दा यह है कि टीपी डीयू या रिकॉर्ड्स प्रदान नहीं करता है। मैं आपके द्वारा वर्णित 'व्यवसाय' प्रकार प्रदान करने में सक्षम नहीं होगा। – Leleutch

+0

हाय लीलेच, मैंने टाइप संयम को समायोजित करने के लिए अपना उत्तर संपादित किया –

0

प्रदत्त प्रकारों के बीच विरासत बहुत कठिन है। आप यह कैसे कर सकते हैं इस बारे में विचार प्राप्त करने के लिए आप इस article को पढ़ सकते हैं, लेकिन इसमें भी आप देखेंगे कि लेखक को उनके सर्वोत्तम प्रयासों के बावजूद कम सफलता मिली है। ऐसा लगता है कि प्रकार प्रदाता तंत्र का वर्तमान कार्यान्वयन अन्य प्रदत्त प्रकारों से उपलब्ध प्रकारों की विरासत के संबंध में बहुत ही अनुकूल नहीं है।

आपके लिए मेरा सुझाव बहुत आसान है, बस active patterns का उपयोग करें और आप जो कुछ भी चाहते हैं उससे मेल खा सकेंगे।

संपादित करें: वास्तव में, आपको सक्रिय पैटर्न का उपयोग करने की भी आवश्यकता नहीं है, क्योंकि आप किसी भी तरह से पैटर्न मिलान कर सकते हैं।

संबंधित मुद्दे