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
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.
Görev
KolayGö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:AudioPlayeralanı (Brand) dize türünde olan vePlay() stringdöndüren bir[Brand] playing audioyöntemine sahip bir structPlayableyöntemi gerektiren birPlay() stringarayüzüSmartphone'ı gömen veModelalanına sahip birAudioPlayerstruct'ıTablet'ı gömen veModelalanına sahip birAudioPlayerstruct'ı
main.go: Herhangi birStartPlaybackkabul eden vePlayableçağrısının sonucunu döndürenPlay()adlı bir işlev oluşturun. Girdi üzerinden cihaz bilgilerini okuyun, bir Smartphone ve bir Tablet oluşturun ve her iki türün dePlayableyöntemini kendileri açıkça uygulamamalarına rağmen, gömülüAudioPlayeraracılığıylaPlay()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 audioHem 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")
}
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
1Go OOP Temelleri
Harici DosyalarGo Çalışma Alanı ve ModüllerPaketler ve İçe AktarmalarDışa Aktarılan ve Aktarılmayan İsimlerGo'da OOP'ye GirişSınıf Olarak Struct'larStruct'larda Metot TanımlamaPointer ve Değer AlıcılarStruct BaşlatmaYapıcı FonksiyonlarÖzet - Basit Hesap Makinesi4Arayüzler
Arayüzlere GirişÖrtük UygulamaSözleşme Olarak ArayüzBoş Arayüz (any)Tür OnaylamaTür SeçimiArayüz BileşimiStringer ve Error ArayüzleriÖzet - Şekil Hesaplayıcı7Kapsülleme
Dışa Aktarılan ve Aktarılmayan AlanlarPaket Seviyesinde KapsüllemeGetter ve Setter MetotlarıGo'da Bilgi GizlemeÖzet - Öğrenci Kayıtları10Generics (Go 1.18+)
Generics'e GirişTür ParametreleriTür KısıtlamalarıGeneric Struct'larGeneric Metotlar İçin Geçici ÇözümÖzet - Generic Koleksiyon13Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıAbstract Factory KalıbıObserver KalıbıStrategy Kalıbı2Türler ve Struct'lar: Derinlemesine İnceleme
Temel ve Bileşik TürlerÖzel Tür TanımlamalarıStruct EtiketleriAnonim Struct'larİç İçe Geçmiş Struct'larSıfır Değerler ve VarsayılanlarÖzet - Rehber5Kalıtım Yerine Kompozisyon
Go'da Neden Kalıtım YokStruct Gömme TemelleriMetot YükseltmeBirden Fazla Struct GömmeGömme vs AgregasyonGömülü Metotları GölgelemeÖzet - Çalışan Hiyerarşisi8Hata Yönetimi ve OOP
error ArayüzüÖzel Hata TürleriHata Sarmalama (fmt.Errorf)Sentinel Hatalarerrors.Is() ve errors.As()Panic, Defer ve RecoverÖzet - Dosya Ayrıştırıcı3İşaretçiler ve Bellek
Go'da İşaretçi TemelleriStruct İşaretçileriDeğer ile Geçme ve Referans ile Geçmenew() FonksiyonuGo'da Garbage CollectionÖzet - Linked List Oluşturucu6Go'da Polimorfizm
Interface'ler ile PolimorfizmGo'da Duck TypingInterface Karşılama KurallarıPolimorfik KoleksiyonlarDependency InjectionÖzet - Payment Processor9Eşzamanlılık ve OOP
Goroutine TemelleriKanallar ve İletişimTamponlu ve Tamponsuz KanallarSelect İfadesisync.Mutex ve sync.RWMutexsync.WaitGroupThread-Safe Struct TasarımıÖzet - Worker PoolKendi başına pratik yap: Online Go derleyicisi