Menu
CoddyTech

Mengapa Go Tidak Memiliki Pewarisan

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

Bahasa berorientasi objek tradisional seperti Java dan C++ menggunakan pewarisan untuk berbagi kode antar tipe. Child class memperluas parent class dan mewarisi semua field serta method-nya. Go sengaja tidak menyertakan fitur ini.

Pewarisan menciptakan keterikatan yang erat antara tipe. Saat parent class berubah, semua child class terdampak.

Hierarki pewarisan yang dalam menjadi sulit dipahami dan dipelihara. "Masalah class dasar yang rapuh" terjadi ketika perubahan pada class dasar secara tak terduga merusak class turunan.

Para perancang Go memilih pendekatan yang berbeda: komposisi daripada pewarisan. Alih-alih mengatakan "seekor Dog adalah Animal," Go mendorongmu untuk mengatakan "seekor Dog memiliki perilaku seperti Animal." Perubahan kecil ini menghasilkan kode yang lebih fleksibel dan mudah dipelihara.

Go mencapai penggunaan ulang kode melalui dua mekanisme yang sudah kamu pelajari:

  • Antarmuka mendefinisikan kontrak perilaku tanpa detail implementasi
  • Embedding struct memungkinkan tipe menyertakan tipe lain dan menggunakan kembali method-nya

Pertimbangkan perbandingan ini. Dalam OOP tradisional, kamu mungkin menulis class Dog extends Animal. Di Go, kamu menyematkan struct Animal di dalam Dog dan mengimplementasikan interface bersama. Hasilnya adalah fungsionalitas yang serupa dengan keterikatan yang lebih longgar antar tipe.

Bab ini membahas embedding struct secara mendalam, serta menunjukkan cara Go memperoleh manfaat pewarisan tanpa kekurangannya.

challenge icon

Tantangan

Mudah

Mari buat sistem notifikasi yang menunjukkan pendekatan komposisi Go, bukan pewarisan. Kamu akan membuat tipe-tipe yang berbagi perilaku melalui interface dan penyematan struct, bukan hierarki class.

Kamu akan mengatur kodemu dalam tiga file:

  • notifier.go: Definisikan interface Notifier dengan satu method Notify(message string) string. Buat juga struct BaseNotifier dengan field Name yang akan disematkan oleh tipe-tipe lain. Beri BaseNotifier method bernama Format(message string) string yang mengembalikan pesan dengan nama notifier di dalam tanda kurung siku sebagai awalan.
  • channels.go: Buat dua tipe saluran notifikasi yang menyematkan BaseNotifier dan mengimplementasikan interface Notifier:
    • EmailNotifier dengan field tambahan Address
    • SMSNotifier dengan field tambahan Phone
    Method Notify setiap tipe harus menggunakan method Format yang disematkan dan menyertakan informasi salurannya dalam output.
  • main.go: Buat fungsi bernama SendAlert yang menerima sembarang Notifier dan sebuah pesan, lalu mengembalikan hasil pemanggilan Notify. Baca detail notifikasi dari input, buat kedua tipe notifier, lalu tunjukkan cara keduanya dapat digunakan secara bergantian melalui interface.

Input berikut akan diberikan:

  • Baris 1: Nama notifier untuk email
  • Baris 2: Alamat email
  • Baris 3: Nama notifier untuk SMS
  • Baris 4: Nomor telepon
  • Baris 5: Pesan peringatan

Method Format pada BaseNotifier harus mengembalikan:

[Name] message

Method Notify harus mengembalikan:

  • EmailNotifier: Email to [Address]: [formatted message]
  • SMSNotifier: SMS to [Phone]: [formatted message]

Contohnya, jika diberikan Alerts, user@mail.com, Urgent, 555-1234, dan Server down, outputmu seharusnya:

Email to user@mail.com: [Alerts] Server down
SMS to 555-1234: [Urgent] Server down

Perhatikan bahwa kedua tipe notifier menggunakan kembali method Format dari BaseNotifier melalui penyematan, sementara masing-masing menyediakan implementasi Notify</code sendiri. Fungsi <code>SendAlert bekerja dengan sembarang Notifier tanpa mengetahui tipe konkretnya. Inilah contoh komposisi sebagai pengganti pewarisan.

Coba sendiri

package main

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

// SendAlert menerima Notifier apa pun dan sebuah pesan, lalu mengembalikan hasil pemanggilan Notify
// TODO: Implementasikan fungsi SendAlert

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// Baca nama pengirim notifikasi email
	scanner.Scan()
	emailName := scanner.Text()
	
	// Baca alamat email
	scanner.Scan()
	emailAddress := scanner.Text()
	
	// Baca nama pengirim notifikasi SMS
	scanner.Scan()
	smsName := scanner.Text()
	
	// Baca nomor telepon
	scanner.Scan()
	phoneNumber := scanner.Text()
	
	// Baca pesan peringatan
	scanner.Scan()
	alertMessage := scanner.Text()
	
	// TODO: Buat EmailNotifier dengan emailName dan emailAddress
	
	// TODO: Buat SMSNotifier dengan smsName dan phoneNumber
	
	// TODO: Gunakan SendAlert untuk mengirim alertMessage melalui kedua pengirim notifikasi
	// dan cetak hasilnya
	
	// Hilangkan peringatan variabel yang belum digunakan (hapus baris ini saat kamu menggunakan variabel tersebut)
	_ = emailName
	_ = emailAddress
	_ = smsName
	_ = phoneNumber
	_ = alertMessage
}
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