Gömülü Metotları Gölgeleme
Coddy'nin GO Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 39 / 107.
Bazen dış yapının, gömülü türün zaten sahip olduğu bir yönteme kendi uygulamasını sağlaması gerekir. Buna gölgeleme denir ve yükseltilmiş yöntemleri özel davranışla geçersiz kılmanıza olanak tanır.
İç içe yerleştirilmiş bir yöntemle aynı ada sahip bir yöntemi dış yapı üzerinde tanımladığınızda, dış yapıdaki yöntem öncelik kazanır:
type Animal struct {
Name string
}
func (a Animal) Speak() string {
return "Some sound"
}
type Dog struct {
Animal
Breed string
}
func (d Dog) Speak() string {
return "Woof!"
}
Şimdi bir Dog üzerinde Speak() çağırdığınızda, dış yöntem kullanılır:
func main() {
d := Dog{Animal: Animal{Name: "Rex"}, Breed: "Labrador"}
fmt.Println(d.Speak()) // Woof! - Dog'un metodu
fmt.Println(d.Animal.Speak()) // Bir ses - Animal'ın metodu
}
Gömülü yöntem ortadan kalkmış değil. Ona hâlâ gömülü tür adı üzerinden açıkça erişebilirsin. Bu kalıp, özgün uygulamayı kullanılabilir durumda tutarken davranışı özelleştirmek istediğinde yararlıdır; örneğin onu geçersiz kıldığın yöntemin içinden çağırmak için:
func (d Dog) Speak() string {
return d.Animal.Speak() + " (but actually Woof!)"
}
Gölgeleme, açık niteleme aracılığıyla asıl davranışa erişimi korurken hangi davranışın ortaya çıkarılacağı üzerinde kontrol sahibi olmanızı sağlar.
Görev
KolayFarklı bildirim kanallarının mesajları biçimlendirme ve iletme yöntemlerini özelleştirebildiği bir bildirim sistemi oluşturalım. Belirli kanalların varsayılan davranışı geçersiz kılmasına, ancak gerektiğinde özgün uygulamaya erişebilmesine olanak tanımak için yöntem gölgelemesini kullanacaksın.
Kodunu üç dosyaya ayıracaksın:
base.go:BaseNotificationveTitlealanlarına (her ikisi de string) sahip birPrioritystruct'ı oluştur. Bildirimi standart bir biçimde döndüren birFormat() stringyöntemi ekle:[Priority] Title.channels.go:BaseNotificationyapısını gömen veFormatyöntemini kendi uygulamalarıyla gölgeleyen iki bildirim kanalı türü oluştur:EmailNotification, birRecipientalanına sahip olmalı.Format()yöntemiEmail to [Recipient]: [Priority] Titledöndürmeli.SlackNotification, birChannelalanına sahip olmalı.Format()yöntemi, gömülüBaseNotification.Format()yöntemini çağırmalı ve sonucun başına#[Channel]:eklemeli.
main.go: Bildirim ayrıntılarını girdiden oku, her iki bildirim türünü oluştur ve aşağıdakileri yazdırarak gölgelemeyi göster:EmailNotification'ın biçimlendirilmiş çıktısı (gölgelenmiş yöntemi kullanarak)EmailNotification'ın temel biçimi (gömülü yöntemi açıkça çağırarak)SlackNotification'ın biçimlendirilmiş çıktısı (bu çıktı dahili olarak temel yöntemi kullanır)
Aşağıdaki girdiler sağlanacaktır:
- 1. satır: Bildirim başlığı
- 2. satır: Öncelik düzeyi
- 3. satır: E-posta alıcısı
- 4. satır: Slack kanal adı
Örneğin Server Alert, HIGH, admin@company.com ve ops-alerts verildiğinde çıktın şu şekilde olmalıdır:
Email to admin@company.com: HIGH Server Alert
[HIGH] Server Alert
#ops-alerts: [HIGH] Server AlertEmailNotification'ın temel biçimlendirmeyi tamamen değiştirdiğine, SlackNotification'ın ise özgün yöntemi çağırıp kanal bağlamı ekleyerek bunu geliştirdiğine dikkat et. Her iki yaklaşım da yöntem gölgelemesini etkili biçimde kullanmanın farklı yollarını gösterir.
Kendin dene
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Bildirim başlığını oku
scanner.Scan()
title := scanner.Text()
// Öncelik seviyesini oku
scanner.Scan()
priority := scanner.Text()
// E-posta alıcısını oku
scanner.Scan()
recipient := scanner.Text()
// Slack kanal adını oku
scanner.Scan()
channel := scanner.Text()
// TODO: Temel bildirim, title, priority ve recipient ile bir EmailNotification oluştur
// TODO: Temel bildirim, title, priority ve channel ile bir SlackNotification oluştur
// TODO: EmailNotification'ın biçimlendirilmiş çıktısını yazdır (gölgelenmiş metodunu kullanarak)
// TODO: EmailNotification'ın temel formatını yazdır (gömülü metodu açıkça çağırarak)
// TODO: SlackNotification'ın biçimlendirilmiş çıktısını yazdır
fmt.Println() // Yer tutucu - uygularken kaldır
}
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