2016-10-17 8 views
7

मैं गो के अपने सीखने के साथ संघर्ष कर रहा हूं।क्या मैं गोलांग में एक प्रकार का उपनाम बना सकता हूं?

मैं बार में एक सेट के इस स्वच्छ कार्यान्वयन पाया: gopkg.in/fatih/set.v0, लेकिन मैं एक और अधिक स्पष्ट नाम है कि set.Set के साथ अपने सेट नामकरण, की तरह कुछ कर रही पसंद करते हैं:

type View set.Set 

संक्षेप में, मैं चाहता हूँ मेरी Viewset.Set के तरीकों के उत्तराधिकारी के प्रकार। क्योंकि, अच्छी तरह से, Viewवर्णनकर्ताओं केset.Set है। लेकिन मुझे पता है गो गो विरासत पर बहुत चोटी है, और सामान्य रूप से टाइपिंग।

अभी के लिए मैं निम्नलिखित थोड़े विरासत की कोशिश कर रहा है, लेकिन यह त्रुटियों का भार जब func Union(set1, set2 Interface, sets ...Interface) Interface या func (s *Set) Merge(t Interface) जैसे कुछ कार्यों का उपयोग करने की कोशिश कर पैदा:

type View struct { 
    set.Set 
} 

मैं हो, तो जानना चाहते हैं जो कुछ मैं चाहता हूं उसे प्राप्त करने का एक तरीका, या यदि मैं सिर्फ अपनी अच्छी-ओल 'ओओ प्रथाओं को उस भाषा में लागू करने की कोशिश कर रहा हूं जो उन्हें छोड़ देता है, तो कृपया।

+3

लिखने की कोशिश मत करो विरासत के साथ ओओ भाषाओं की तरह जाओ। _no_ विरासत है, इसलिए आप केवल अधिक भ्रम पैदा करने जा रहे हैं। यदि आप स्वचालित रूप से विधियों और फ़ील्ड का प्रतिनिधि बनाना चाहते हैं, तो आप अपने दूसरे उदाहरण में एम्बेडिंग का उपयोग कर सकते हैं, जो कि ठीक है, लेकिन ध्यान रखें कि यह केवल रचना का एक रूप है। – JimB

+0

तो, आपकी सलाह मूल सेट का उपयोग कर रही है। जैसा कि प्रकार है?चूंकि सेट के फ़ंक्शंस का उपयोग एम्बेडेड प्रकार से इतना बोझिल है? यह इतना बुरा नहीं है, मैं जो कर रहा था उसके बारे में सोचने से पहले मैं सीधे विरासत में गया था। –

+2

यदि आप रुचि रखते हैं, तो विलियम केनेडी द्वारा इस विषय पर एक अच्छा लेख है: https://www.goinggo.net/2016/10/reducing-type-hierarchies.html – thoeni

उत्तर

1

ध्यान दें, मुझे लगता है कि सरल अलियासिंग आप शुरू में प्रस्तावित वाक्य रचना मान्य है, हालांकि बल्कि set.Set aliasing यह उर्फ ​​set.Interface के लिए और अधिक समझ कर सकता है की तुलना में, सेट पुस्तकालय का शीघ्रता से अवलोकन किया था के बाद, उदाहरण के लिए:

package main 

import (
    "fmt" 

    set "gopkg.in/fatih/set.v0" 
) 

// View is a type alias for the set.Interface interface 
type View set.Interface 

// Display takes one of our View types in order to print it. 
func Display(view View) { 
    fmt.Println(view.List()) 
} 

func main() { 
    // create our first set.Interface or View 
    v1 := set.New() 
    v1.Add("foo") 

    // create our second set.Interface or View 
    v2 := set.New("bar") 

    // call a set function 
    v3 := set.Union(v1, v2) 

    // call our function that takes a View 
    Display(v3) 
} 

आपने देखा होगा कि मैं किसी भी तरह से धोखा दे रहा हूं क्योंकि मैं Display फ़ंक्शन पर पैरामीटर को परिभाषित करने के अलावा उपरोक्त कोड में उपनाम प्रकार का कोई वास्तविक उल्लेख नहीं करता हूं, जिसके ऊपर आप उदाहरण set.Interface के बजाय उदाहरण लेते हैं। यदि आपके पास इन चीजों पर काम करने के बहुत सारे काम हैं, तो यह आपके डोमेन के लिए अधिक स्पष्ट रूप से पढ़ सकता है।

ध्यान दें कि हमारे View प्रकार एक इंटरफ़ेस प्रकार के लिए उपनाम है, इसलिए यह उस प्रकार के अपने कार्यों को जोड़ने से रोकता है क्योंकि गो हमें फ़ंक्शन के लिए इंटरफ़ेस रिसीवर प्रकार नहीं देता है (मैं गलत तरीके से व्यक्त कर रहा हूं)। इस से मेरा मतलब है कि आप कुछ भी की तरह नहीं कर सकते:

func (v View) Display() string { 
    return v.String() 
} 

सारांश में मुझे लगता है कि aliasing बातें, यह आंतरिक एपीआई अधिक पठनीय बना सकते हैं ठीक है, और आप संकलक मदद करने के लिए की कुछ वर्गों को समाप्त करने पर दुबला कर सकते हैं त्रुटियों; हालांकि यह आपको कस्टम प्रकार में कार्यक्षमता जोड़ने की अनुमति नहीं देता है। यदि यह आवश्यक है तो वैकल्पिक दृष्टिकोण आवश्यक होगा, या तो एम्बेडिंग या सरल संरचना (यानी View में Set है)।

5

यदि कोई और इस प्रश्न पर वापस आ रहा है, Go 1.9 प्रकार उपनाम अब समर्थित हैं। type T1 = T2

तो अपने उदाहरण में आप सिर्फ type View = set.Set कर सकते हैं और के रूप में आप चाहते हैं सब कुछ काम करेंगे:

एक प्रकार उर्फ ​​रूप है।

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

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