Menu
CoddyTech

Membayangi method yang Disematkan

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GO di Coddy. Pelajaran 39 dari 107.

Terkadang, kamu perlu membuat struct luar menyediakan implementasinya sendiri untuk method yang sudah dimiliki oleh tipe yang disematkan. Ini disebut shadowing, dan memungkinkanmu mengganti method yang dipromosikan dengan perilaku khusus.

Saat kamu mendefinisikan method pada struct luar dengan nama yang sama seperti method yang disematkan, method luar diutamakan:

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!"
}

Sekarang saat kamu memanggil Speak() pada Dog, method luarnya digunakan:

func main() {
    d := Dog{Animal: Animal{Name: "Rex"}, Breed: "Labrador"}
    
    fmt.Println(d.Speak())        // Woof! , method milik Dog
    fmt.Println(d.Animal.Speak()) // Some sound, method milik Animal
}

method yang disematkan tidak hilang. Kamu tetap bisa mengaksesnya secara eksplisit melalui nama tipe yang disematkan. Pola ini berguna saat kamu ingin menyesuaikan perilaku sambil tetap menyediakan implementasi aslinya, misalnya untuk memanggilnya dari dalam method yang kamu timpa:

func (d Dog) Speak() string {
    return d.Animal.Speak() + " (but actually Woof!)"
}

Shadowing memberimu kendali atas perilaku mana yang ditampilkan, sambil tetap memberi akses ke perilaku asli melalui kualifikasi eksplisit.

challenge icon

Tantangan

Mudah

Mari buat sistem notifikasi yang memungkinkan berbagai channel notifikasi menyesuaikan cara mereka memformat dan mengirim pesan. Kamu akan menggunakan method shadowing agar channel tertentu dapat mengganti perilaku default, sekaligus tetap dapat mengakses implementasi aslinya saat diperlukan.

Kamu akan mengatur kodemu dalam tiga file:

  • base.go: Buat struct BaseNotification dengan field Title dan Priority (keduanya bertipe string). Berikan method Format() string yang mengembalikan notifikasi dalam format standar: [Priority] Title.
  • channels.go: Buat dua tipe channel notifikasi yang menyematkan BaseNotification dan melakukan shadowing pada method Format dengan implementasi masing-masing:
    • EmailNotification dengan field Recipient. Format() harus mengembalikan Email to [Recipient]: [Priority] Title
    • SlackNotification dengan field Channel. Format() harus memanggil method BaseNotification.Format() yang disematkan dan menambahkan #[Channel]: di awal hasilnya
  • main.go: Baca detail notifikasi dari input, buat kedua tipe notifikasi, lalu tunjukkan shadowing dengan mencetak:
    1. Output berformat dari EmailNotification (menggunakan method-nya yang melakukan shadowing)
    2. Format dasar EmailNotification (dengan memanggil method yang disematkan secara eksplisit)
    3. Output berformat dari SlackNotification (yang secara internal menggunakan method dasar)

Input berikut akan diberikan:

  • Baris 1: Judul notifikasi
  • Baris 2: Tingkat prioritas
  • Baris 3: Penerima email
  • Baris 4: Nama channel Slack

Contohnya, jika diberikan Server Alert, HIGH, admin@company.com, dan ops-alerts, outputmu seharusnya:

Email to admin@company.com: HIGH Server Alert
[HIGH] Server Alert
#ops-alerts: [HIGH] Server Alert

Perhatikan bagaimana EmailNotification sepenuhnya menggantikan pemformatan dasar, sedangkan SlackNotification menyempurnakannya dengan memanggil method asli dan menambahkan konteks channel. Kedua pendekatan ini menunjukkan berbagai cara menggunakan method shadowing secara efektif.

Coba sendiri

package main

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

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Baca judul notifikasi
	scanner.Scan()
	title := scanner.Text()
	
	// Baca tingkat prioritas
	scanner.Scan()
	priority := scanner.Text()
	
	// Baca penerima email
	scanner.Scan()
	recipient := scanner.Text()
	
	// Baca nama channel Slack
	scanner.Scan()
	channel := scanner.Text()
	
	// TODO: Buat EmailNotification dengan notifikasi dasar, judul, prioritas, dan penerima
	
	// TODO: Buat SlackNotification dengan notifikasi dasar, judul, prioritas, dan channel
	
	// TODO: Cetak output terformat dari EmailNotification (gunakan method miliknya yang menutupi method dasar)
	
	// TODO: Cetak format dasar EmailNotification (panggil method yang disematkan secara eksplisit)
	
	// TODO: Cetak output terformat dari SlackNotification
	
	fmt.Println() // Penampung sementara, hapus saat mengimplementasikan
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Go online