Menu
Coddy logo textTech

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.

challenge icon

Görev

Kolay

Farklı 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: BaseNotification ve Title alanlarına (her ikisi de string) sahip bir Priority struct'ı oluştur. Bildirimi standart bir biçimde döndüren bir Format() string yöntemi ekle: [Priority] Title.
  • channels.go: BaseNotification yapısını gömen ve Format yöntemini kendi uygulamalarıyla gölgeleyen iki bildirim kanalı türü oluştur:
    • EmailNotification, bir Recipient alanına sahip olmalı. Format() yöntemi Email to [Recipient]: [Priority] Title döndürmeli.
    • SlackNotification, bir Channel alanı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:
    1. EmailNotification'ın biçimlendirilmiş çıktısı (gölgelenmiş yöntemi kullanarak)
    2. EmailNotification'ın temel biçimi (gömülü yöntemi açıkça çağırarak)
    3. 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 Alert

EmailNotification'ı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
}
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