Metod ve embedding
- Go kursu
- Başlangıç
- Ders 78/90
- 4 dk
Gömülü struct'ların metodlarının nasıl yükseldiğini öğrenirsin.
Metod ve embedding
Gömülü bir struct'ın metodları da dıştaki struct'a yükseltilir; dıştaki tür onları kendi metodu gibi çağırır:
type Kayitci struct{ Onek string }
func (k Kayitci) Logla(m string) { fmt.Println(k.Onek + m) }
type Servis struct {
Kayitci
Ad string
}
s := Servis{Kayitci{"[api] "}, "sepet"}
s.Logla("başladı") // [api] başladıBöylece ortak davranış kalıtım olmadan yeniden kullanılır.
Gölgeleme ve sarmalama
Dıştaki tür aynı adlı metodu tanımlayıp gömülü olanı içeriden çağırarak davranışı genişletebilir:
func (s Servis) Logla(m string) {
s.Kayitci.Logla(s.Ad + ": " + m)
}
s.Logla("başladı") // [api] sepet: başladıBu desen, başka dillerdeki "üst sınıf metodunu çağırma"nın Go karşılığıdır ama açık ve görünürdür.
Uygulama Sarmalanan kayıtçı
Yukarıdaki Kayitci ve onu gömen Servis türlerini yaz; Servis kendi Logla metoduyla mesajın başına s.Ad + ": " ekleyip gömülü Logla'yı çağırsın. Servis{Kayitci{"[api] "}, "sepet"}.Logla("başladı") çalıştır.
Başlangıç kodu
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
package main
import "fmt"
type Kayitci struct{ Onek string }
func (k Kayitci) Logla(m string) { fmt.Println(k.Onek + m) }
type Servis struct {
Kayitci
Ad string
}
func (s Servis) Logla(m string) {
s.Kayitci.Logla(s.Ad + ": " + m)
}
func main() {
Servis{Kayitci{"[api] "}, "sepet"}.Logla("başladı")
}Beklenen çıktı
[api] sepet: başladı
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Servis kendi <code>Logla</code> metodunu tanımlarsa <code>s.Logla("x")</code> hangisini çağırır?
- İkisini de
- Derleme hatası
- Servis'in kendi Logla'sını Doğru cevap
- Kayitci'nin Logla'sını
Açıklama: Dıştaki türün metodu gömülü olanı gölgeler; gömülü metod s.Kayitci.Logla("x") ile yine çağrılabilir.
2 Gömülü metodu çağır
func (s Servis) Logla(m string) {
s.____.Logla(s.Ad + ": " + m)
}
func (s Servis) Logla(m string) {
s.Kayitci.Logla(s.Ad + ": " + m)
}
Açıklama: Gömülü türün adı, onun metoduna tam yolla erişmeyi sağlar.
3 Çağrı ve sonuç
| Kavram | Anlamı |
|---|---|
s.Logla (Servis'te yoksa) |
Kayitci.Logla |
s.Logla (Servis'te varsa) |
Servis.Logla |
s.Kayitci.Logla |
Her zaman gömülü |
Embedding |
Yeniden kullanım |