Menu
Coddy logo textTech

Metot Yükseltme

Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 36 / 107.

Tıpkı struct gömmenin (embedding) alanları dış struct'a yükseltmesi gibi, Go gömülü türlerdeki metotları da yükseltir. Bu, gömülü struct üzerinde tanımlanan metotları doğrudan dış struct üzerinden çağırabileceğiniz anlamına gelir.

type Engine struct {
    Horsepower int
}

func (e Engine) Start() string {
    return "Engine started"
}

type Car struct {
    Model string
    Engine  // gömülü
}

Car yapısı Engine yapısını gömdüğü için Start() metodu otomatik olarak üst seviyeye taşınır:

func main() {
    c := Car{
        Model:  "Sedan",
        Engine: Engine{Horsepower: 200},
    }
    
    fmt.Println(c.Start())         // Motor çalıştırıldı
    fmt.Println(c.Engine.Start())  // bu da çalışır
}

Bu yükseltmenin (promotion) arayüzler için önemli bir sonucu vardır. Eğer gömülü tür bir arayüzü karşılıyorsa, dış tür de otomatik olarak o arayüzü karşılar:

type Starter interface {
    Start() string
}

func Ignite(s Starter) {
    fmt.Println(s.Start())
}

func main() {
    c := Car{Model: "Sedan", Engine: Engine{Horsepower: 200}}
    Ignite(c)  // Car, Engine aracılığıyla Starter arayüzünü karşılar
}

Car tipi hiçbir zaman açıkça Starter arayüzünü uygulamaz, ancak gömülü Engine gerekli metoda sahip olduğu için arayüzü karşılar. Go, geleneksel kalıtım olmadan davranışın yeniden kullanımını bu şekilde gerçekleştirir.

challenge icon

Görev

Kolay

Gömülü türlerdeki metotların dış türe nasıl aktarıldığını ve bunun kompozisyon yoluyla arayüz (interface) uyumluluğunu nasıl sağladığını gösteren bir müzik çalar sistemi oluşturalım.

Kodunuzu iki dosya halinde düzenleyeceksiniz:

  • audio.go: Müzik çalarınız için temel yapı taşlarını oluşturun:
    • Brand alanına (string) ve [Brand] playing audio değerini döndüren bir Play() string metoduna sahip bir AudioPlayer yapısı (struct).
    • Play() string metodu gerektiren bir Playable arayüzü (interface).
    • AudioPlayer yapısını gömen (embed), Model alanına sahip bir Smartphone yapısı.
    • AudioPlayer yapısını gömen (embed), Model alanına sahip bir Tablet yapısı.
  • main.go: Herhangi bir Playable kabul eden ve Play() metodunu çağırmanın sonucunu döndüren StartPlayback adında bir fonksiyon oluşturun. Girişten cihaz bilgilerini okuyun, hem bir Smartphone hem de bir Tablet oluşturun ve her iki türün de Play() metodunu açıkça uygulamamasına rağmen, gömülü AudioPlayer aracılığıyla Playable arayüzünü nasıl karşıladığını gösterin.

Aşağıdaki girişler sağlanacaktır:

  • Satır 1: Akıllı telefon model adı
  • Satır 2: Akıllı telefon ses markası
  • Satır 3: Tablet model adı
  • Satır 4: Tablet ses markası

Her cihaz için, önce modelini, ardından cihazı StartPlayback fonksiyonuna göndermenin sonucunu yazdırın.

Örneğin, iPhone 15, Apple Audio, iPad Pro ve Beats verildiğinde çıktınız şu şekilde olmalıdır:

iPhone 15
Apple Audio playing audio
iPad Pro
Beats playing audio

AudioPlayer içindeki Play() metodunun otomatik olarak her bir dış türe aktarılması sayesinde, hem Smartphone hem de Tablet yapılarının herhangi bir ek kod yazılmadan Playable arayüzünü nasıl karşıladığına ve StartPlayback fonksiyonuna nasıl gönderilebildiğine dikkat edin.

Kopya kağıdı

Bir struct başka bir türü gömdüğünde, gömülü türdeki metotlar otomatik olarak dıştaki struct'a aktarılır (promoted):

type Engine struct {
    Horsepower int
}

func (e Engine) Start() string {
    return "Engine started"
}

type Car struct {
    Model string
    Engine  // gömülü
}

func main() {
    c := Car{
        Model:  "Sedan",
        Engine: Engine{Horsepower: 200},
    }
    
    fmt.Println(c.Start())         // Engine started
    fmt.Println(c.Engine.Start())  // bu da çalışır
}

Eğer gömülü bir tür bir arayüzü (interface) karşılıyorsa, dıştaki tür de otomatik olarak onu karşılar:

type Starter interface {
    Start() string
}

func Ignite(s Starter) {
    fmt.Println(s.Start())
}

func main() {
    c := Car{Model: "Sedan", Engine: Engine{Horsepower: 200}}
    Ignite(c)  // Car, Engine aracılığıyla Starter arayüzünü karşılar
}

Bu, geleneksel kalıtım olmadan kompozisyon (composition) yoluyla davranışın yeniden kullanılmasını sağlar.

Kendin dene

package main

import (
	"bufio"
	"fmt"
	"os"
)

// TODO: Herhangi bir Playable kabul eden bir StartPlayback fonksiyonu oluşturun
// ve Play() çağrısının sonucunu döndürün

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Akıllı telefon modelini oku
	scanner.Scan()
	smartphoneModel := scanner.Text()
	
	// Akıllı telefon ses markasını oku
	scanner.Scan()
	smartphoneBrand := scanner.Text()
	
	// Tablet modelini oku
	scanner.Scan()
	tabletModel := scanner.Text()
	
	// Tablet ses markasını oku
	scanner.Scan()
	tabletBrand := scanner.Text()
	
	// TODO: Gömülü AudioPlayer ile bir Smartphone oluşturun
	
	// TODO: Gömülü AudioPlayer ile bir Tablet oluşturun
	
	// TODO: Akıllı telefon modelini yazdırın, ardından akıllı telefon ile StartPlayback fonksiyonunu çağırın
	
	// TODO: Tablet modelini yazdırın, ardından tablet ile StartPlayback fonksiyonunu çağırın
	
	_ = smartphoneModel
	_ = smartphoneBrand
	_ = tabletModel
	_ = tabletBrand
	fmt.Println("TODO: Complete the implementation")
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler