ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 5 · 5లో పాఠం 3కోర్సులో 23/50~12 min
మాడ్యూల్ పాఠాలు (3/5)

కూర్పు (పొందుపరచడం)

గో కి వారసత్వం లేదు. పునర్వినియోగానికి అనువైన సమాధానం కంపోజిషన్, మరియు ముఖ్యంగా ** ఎంబెడ్డింగ్**: ఒక రకంతో సహా ఫీల్డ్ పేరు ఇవ్వకుండా మరొక దాని లోపల. క్షేత్రాలు మరియు పద్ధతులు పొందుపరిచిన రకం ప్రమోట్ చేయబడింది, నేరుగా అందుబాటులోకి వస్తుంది అవి బయటి రకానికి చెందినవి.

స్ట్రక్ట్ ఎంబెడ్డింగ్

Go
type Animal struct {
    Name string
}

func (a Animal) Greet() string {
    return "ciao da " + a.Name
}

type Dog struct {
    Animal        // embedding — NO field name
    Breed string
}

c := Dog{
    Animal: Animal{Name: "Rex"},
    Breed:  "Pastore",
}

fmt.Println(c.Name)         // "Rex" — promoted from Animal
fmt.Println(c.Greet())      // "ciao da Rex" — promoted method
fmt.Println(c.Breed)        // own field

పొందుపరిచిన ఫీల్డ్ ** ఇప్పటికీ రకం పేరు ద్వారా యాక్సెస్ చేయవచ్చు**: c.Animal.Name పని చేస్తుంది మరియు c.Nameకి సమానంగా ఉంటుంది. ఇది ఎప్పుడు అవసరం ఘర్షణలు ఉన్నాయి.

ఓవర్‌రైడ్ (పాక్షిక): పద్ధతి "షాడోయింగ్"

ప్రమోట్ చేయబడిన అదే పేరుతో బాహ్య రకం పద్ధతిని నిర్వచిస్తే ఒకటి, దాని పద్ధతి "విజయం". లోపల నుండి మీరు ఎల్లప్పుడూ ఎంబెడెడ్ చేరుకోవచ్చు రకం పేరు ద్వారా ఒకటి:

Go
func (c Dog) Greet() string {
    return "BAU! " + c.Animal.Greet()
}

ఇది పాలిమార్ఫిక్ వారసత్వం కాదు: ఇది కేవలం లెక్సికల్ నేమ్ రిజల్యూషన్. పాలిమార్ఫిజం కోసం మీరు ** ఇంటర్‌ఫేస్‌లను** (మాడ్యూల్ 6) ఉపయోగిస్తారు.

బహుళ పొందుపరచడం

మీరు అనేక రకాలను పొందుపరచవచ్చు:

Go
type Logger struct{ /*...*/ }
func (l Logger) Log(msg string) { /*...*/ }

type Timer struct{ /*...*/ }
func (t Timer) Now() time.Time { /*...*/ }

type Service struct {
    Logger
    Timer
    Name string
}

s := Service{Name: "api"}
s.Log("start")   // promoted from Logger
s.Now()          // promoted from Timer

రెండు ఎంబెడెడ్ రకాలు ఒకే పేరుతో పద్ధతిని కలిగి ఉంటే, ప్రత్యక్ష ప్రాప్యత అస్పష్టంగా మారుతుంది మరియు కంపైలర్‌కు స్పష్టమైన రూపం అవసరం (s.Logger.Foo() లేదా s.Timer.Foo()).

ఇంటర్ఫేస్ పొందుపరచడం

ఇంటర్‌ఫేస్‌లను కూడా "ఎంబెడెడ్" చేయవచ్చు (మాడ్యూల్ 6 చూడండి):

Go
type ReadWriter interface {
    io.Reader
    io.Writer
}

ఇది Reader మరియు Writer పద్ధతుల కలయికకు సమానం.

స్పష్టమైన కూర్పును ఎప్పుడు ఉపయోగించాలి (పొందుపరచడం కాదు)

మీకు పేరు పెట్టబడిన ఫీల్డ్ మరియు ఆటో-ప్రమోషన్ లేకపోతే, సాదా ఉపయోగించండి కూర్పు:

Go
type Dog struct {
    Anim  Animal    // NORMAL field, no promotion
    Breed string
}
c.Anim.Name   // you need the field name

పొందుపరచడం అనేది సులభ ప్రతినిధి సాధనం, డిజైన్ ఎంపిక కాదు స్పష్టమైన కూర్పు కంటే ఖచ్చితంగా ఉత్తమం: మీకు నిజంగా కావలసినప్పుడు దాన్ని ఉపయోగించండి అంతర్గత రకం APIని ప్రోత్సహించడానికి.

దీనిని ప్రయత్నించండి

వ్యాయామం#go.m5.l3.e1
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

జంతువును పొందుపరిచిన కుక్కను నిర్వచించండి (పొందుపరచడం, ఫీల్డ్ పేరు లేదు) మరియు బ్రీడ్ స్ట్రింగ్ ఫీల్డ్ ఉంది.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

పొందుపరచడం: ఫీల్డ్ పేరు ఇవ్వకుండా TYPEని వ్రాయండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం#go.m5.l3.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

యానిమల్‌కు గ్రీట్() స్ట్రింగ్ పద్ధతిని జోడించి, దానిని నేరుగా డాగ్ వేరియబుల్ (మెథడ్ ప్రమోషన్)లో కాల్ చేయండి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

యానిమల్‌పై నిర్వచించిన పద్ధతిని పొందుపరిచినందుకు డాగ్‌గా ప్రచారం చేయబడింది.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

Quiz#go.m5.l3.e3
సిద్ధంగా ఉంది

గో సాంప్రదాయ వారసత్వానికి మద్దతు ఇస్తుందా?

Go
type B struct { /* extends A? */ }
సమాధాన ఎంపికలు

రీక్యాప్

  • వారసత్వం లేదు: మీరు ** ఎంబెడ్డింగ్**తో కంపోజ్ చేస్తారు.
  • పొందుపరచడం = స్ట్రక్ట్‌లో ఫీల్డ్ పేరు లేకుండా టైప్ రాయడం.
  • పొందుపరిచిన రకానికి చెందిన ఫీల్డ్‌లు మరియు పద్ధతులు ప్రమోట్ చేయబడతాయి.
  • స్పష్టమైన యాక్సెస్ ఎల్లప్పుడూ అందుబాటులో ఉంటుంది: outer.Inner.Field.
  • "లెక్సికల్" ఓవర్‌రైడ్: బయటి రకం యొక్క పద్ధతి ప్రమోట్ చేయబడిన దానిని నీడ చేస్తుంది.
  • పొందుపరచడం ≠ అనేది-a: పాలిమార్ఫిజం కోసం ఇంటర్‌ఫేస్‌లు.