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ömmesinin alanları dış struct’a yükseltmesi gibi, Go da gömülü türlerdeki metotları yükseltir. Bu, gömülü struct üzerinde tanımlanan metotları doğrudan dış struct üzerinde ç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, Engine'i içerdiğinden Start() yöntemi otomatik olarak öne çıkarılır:

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

Bu yükseltmenin ’ler için önemli bir sonucu vardır. tür bir ’i ediyorsa, dış tür de otomatik olarak onu eder:

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'ı karşılar
}

Car türü Starter arayüzünü hiçbir zaman açıkça uygulamaz; yine de gömülü Engine öğesi gerekli method'a sahip olduğu için arayüzü karşılar. Go, geleneksel kalıtım olmadan davranışın yeniden kullanılmasını böyle sağlar.

challenge icon

Görev

Kolay

Gömülü türlerdeki yöntemlerin dış türe nasıl terfi ettirildiğini ve bunun bileşim yoluyla arayüz uyumluluğunu nasıl mümkün kıldığını gösteren bir müzik çalar sistemi oluşturalım.

Kodunuzu iki dosyaya ayıracaksınız:

  • audio.go: Müzik çalarınız için yapı taşlarını oluşturun:
    • AudioPlayer alanı (Brand) dize türünde olan ve Play() string döndüren bir [Brand] playing audio yöntemine sahip bir struct
    • Playable yöntemi gerektiren bir Play() string arayüzü
    • Smartphone'ı gömen ve Model alanına sahip bir AudioPlayer struct'ı
    • Tablet'ı gömen ve Model alanına sahip bir AudioPlayer struct'ı
  • main.go: Herhangi bir StartPlayback kabul eden ve Playable çağrısının sonucunu döndüren Play() adlı bir işlev oluşturun. Girdi üzerinden cihaz bilgilerini okuyun, bir Smartphone ve bir Tablet oluşturun ve her iki türün de Playable yöntemini kendileri açıkça uygulamamalarına rağmen, gömülü AudioPlayer aracılığıyla Play() arayüzünü karşıladığını gösterin.

Aşağıdaki girdiler sağlanacaktır:

  • 1. satır: Smartphone model adı
  • 2. satır: Smartphone ses markası
  • 3. satır: Tablet model adı
  • 4. satır: Tablet ses markası

Her cihaz için modelini, ardından cihazı StartPlayback işlevine geçirmenin sonucunu yazdırın.

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

iPhone 15
Apple Audio playing audio
iPad Pro
Beats playing audio

Hem Smartphone hem de Tablet türlerinin StartPlayback işlevine geçirilebildiğine dikkat edin; bunun nedeni, Play()'daki AudioPlayer yönteminin otomatik olarak her dış türe terfi ettirilmesi ve böylece ek bir kod gerektirmeden Playable arayüzünü karşılamasıdır.

Kendin dene

package main

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

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

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ştur
	
	// TODO: Gömülü AudioPlayer ile bir Tablet oluştur
	
	// TODO: Akıllı telefon modelini yazdır, ardından smartphone ile StartPlayback çağır
	
	// TODO: Tablet modelini yazdır, ardından tablet ile StartPlayback çağır
	
	_ = 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

Kendi başına pratik yap: Online Go derleyicisi