Dynamic Dispatch
## 1. Konsep Dasar: Kontrak dan Implementasi
package main
import "fmt"
// 1. Interface (Kontrak)
// Setiap tipe yang ingin dianggap sebagai 'Bentuk' harus memiliki metode HitungLuas() float64.
type Bentuk interface {
HitungLuas() float64
}
// 2. Tipe Konkret: Persegi
type Persegi struct {
Sisi float64
}
// Persegi mengimplementasikan interface Bentuk karena memiliki metode HitungLuas().
func (p Persegi) HitungLuas() float64 {
return p.Sisi * p.Sisi
}
// 3. Tipe Konkret: Lingkaran
type Lingkaran struct {
Radius float64
}
// Lingkaran juga mengimplementasikan interface Bentuk.
func (l Lingkaran) HitungLuas() float64 {
return 3.14 * l.Radius * l.Radius
}
// 4. Fungsi yang Menggunakan Interface (Dynamic Dispatch Terjadi di Sini)
// Fungsi ini tidak peduli apakah yang masuk adalah Persegi atau Lingkaran.
// Selama ia adalah sebuah 'Bentuk', fungsi ini bisa memanggil HitungLuas().
func CetakLuas(b Bentuk) {
fmt.Printf("Luas bentuk ini adalah: %0.2f\n", b.HitungLuas())
}
func main() {
persegi := Persegi{Sisi: 10}
lingkaran := Lingkaran{Radius: 5}
// Panggilan CetakLuas(persegi)
// Pada runtime, Go melihat bahwa 'b' berisi tipe Persegi,
// lalu memanggil metode HitungLuas() milik Persegi.
CetakLuas(persegi)
// Panggilan CetakLuas(lingkaran)
// Pada runtime, Go melihat bahwa 'b' berisi tipe Lingkaran,
// lalu memanggil metode HitungLuas() milik Lingkaran.
CetakLuas(lingkaran)
}## 2. Cara Kerja di Balik Layar: Representasi Interface
## 3. Topik Lanjutan dan Implikasi
Ringkasan
Aspek
Penjelasan
Last updated