โ† Kembali ke Konsep OOP
๐Ÿ”€
Pilar

Polymorphism (Polimorfisme)

Memungkinkan objek dengan tipe berbeda diperlakukan melalui interface yang sama, dengan setiap tipe punya perilakunya sendiri untuk pemanggilan yang sama.

Masalahnya

Tanpa polimorfisme, kode harus memakai pengecekan tipe dan percabangan (if/else atau switch berdasarkan tipe) untuk menangani tipe objek yang berbeda. Logika ini terus membesar dan rawan error setiap kali tipe baru ditambahkan.

Cara Kerja

  • โ€บPemanggilan method yang sama menghasilkan perilaku berbeda tergantung tipe objek saat runtime
  • โ€บDicapai lewat method overriding (subtype polymorphism) atau interface/protocol
  • โ€บMenghilangkan kondisional pengecekan tipe; implementasi yang tepat dipanggil otomatis
  • โ€บMemungkinkan penulisan kode generik yang bekerja dengan tipe apa pun yang memenuhi kontraknya

Kapan Digunakan

โœ“Memproses koleksi heterogen secara seragam (misalnya array berisi Shape)
โœ“Sistem plugin atau strategy di mana perilaku berbeda per tipe
โœ“Mengganti logika switch berdasarkan tipe dengan dynamic dispatch

Contoh di Dunia Nyata

๐ŸŽ
iOS

draw() yang dipanggil pada subclass UIView mana pun akan menggambar tampilan subclass itu sendiri

๐Ÿค–
Android

onClick() berperilaku berbeda tergantung listener pada subclass View

๐ŸŒ
Web

toString() di-override per class untuk menghasilkan representasi string sendiri

Contoh Kode

Swift
protocol Shape {
    func area() -> Double
}

struct Circle: Shape {
    let radius: Double
    func area() -> Double { .pi * radius * radius }
}

struct Rectangle: Shape {
    let width: Double
    let height: Double
    func area() -> Double { width * height }
}

let shapes: [Shape] = [Circle(radius: 2), Rectangle(width: 3, height: 4)]
for shape in shapes {
    print("Area: \(shape.area())")
}