CodeBlanks Logo Icon CodeBlanks

Metod ve embedding

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

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
func (s Servis) Logla(m string) {
    s.____.Logla(s.Ad + ": " + m)
}
Cevap
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

Başlangıç bölümündeki tüm dersler