Bagian 5 : Polimorfisme - Penerapan dan Penggunaannya dalam Kotlin

Arya Rezza
3 min readSep 8, 2023

--

Photo by Bernard Hermant on Unsplash

Pengenalan ke Polimorfisme

Polimorfisme, berasal dari kata Yunani ‘poli’ (banyak) dan ‘morph’ (bentuk), adalah sebuah prinsip dasar dalam pemrograman berorientasi objek (OOP). Dalam konteks pemrograman, polimorfisme mengacu pada kemampuan suatu objek untuk mengambil banyak bentuk. Namun, apa arti ini dalam praktik pemrograman sehari-hari dan bagaimana kita menerapkannya, terutama dalam bahasa pemrograman modern seperti Kotlin?

Apa Itu Polimorfisme dan Bagaimana Diterapkan dalam OOP

Dalam OOP, polimorfisme memungkinkan objek untuk diperlakukan sebagai instansi dari kelas induknya atau dari salah satu kelas turunannya. Inti dari polimorfisme adalah kemampuan untuk memanggil metode — yang mungkin didefinisikan dalam kelas turunan — melalui referensi dari kelas induk.

Ada dua jenis utama polimorfisme:

  1. Polimorfisme Compile-time (atau static): Ini adalah saat operasi yang harus dilakukan diputuskan pada saat kompilasi. Salah satu cara paling umum untuk mengimplementasikan polimorfisme compile-time adalah dengan menggunakan overloading metode.
  2. Polimorfisme Run-time (atau dynamic): Di sini, operasi yang harus dilakukan diputuskan pada saat runtime. Ini dicapai dengan menggabungkan pewarisan dengan overriding metode.

Menerapkan Polimorfisme dalam Kotlin

Kotlin, dengan dukungannya yang kuat untuk OOP, menawarkan fitur-fitur canggih untuk implementasi polimorfisme. Mari kita lihat bagaimana kedua jenis polimorfisme ini diterapkan dalam Kotlin:

Contoh Polimorfisme Compile-time di Kotlin:

Dengan overloading fungsi, kita dapat mendefinisikan beberapa fungsi dengan nama yang sama tetapi dengan parameter yang berbeda.

fun volume(panjang: Double, lebar: Double): Double {
return panjang * lebar
}

fun volume(panjang: Double, lebar: Double, tinggi: Double): Double {
return panjang * lebar * tinggi
}

Contoh Polimorfisme Run-time di Kotlin:

Dengan pewarisan dan overriding, kita dapat mendefinisikan ulang perilaku kelas dasar di kelas turunan.

open class Hewan {
open fun suara() {
println("Hewan ini bersuara")
}
}

class Kucing : Hewan() {
override fun suara() {
println("Meong")
}
}

class Anjing : Hewan() {
override fun suara() {
println("Guk Guk")
}
}

fun main() {
val hewan: Hewan = Kucing()
hewan.suara() // Hasil: Meong
}

Contoh Polimorfisme dalam Kasus Nyata

Ambil contoh sebuah perusahaan yang mengembangkan sistem manajemen transportasi. Dalam sistem ini, ada berbagai jenis kendaraan seperti mobil, sepeda motor, dan truk. Meski setiap kendaraan memiliki karakteristik khusus, ada beberapa operasi yang umum, misalnya, memulai dan mematikan mesin.

// Kelas dasar Kendaraan
open class Kendaraan {
open fun mulai() {
println("Kendaraan mulai berjalan")
}

open fun berhenti() {
println("Kendaraan berhenti")
}
}

// Kelas turunan Mobil
class Mobil : Kendaraan() {
override fun mulai() {
println("Mobil mulai berjalan")
}

override fun berhenti() {
println("Mobil berhenti")
}
}

// Kelas turunan Motor
class Motor : Kendaraan() {
override fun mulai() {
println("Motor mulai berjalan")
}

override fun berhenti() {
println("Motor berhenti")
}
}

// Kelas turunan Truk
class Truk : Kendaraan() {
override fun mulai() {
println("Truk mulai berjalan dengan beban berat")
}

override fun berhenti() {
println("Truk berhenti pelan-pelan")
}
}

fun main() {
val daftarKendaraan: List<Kendaraan> = listOf(Mobil(), Motor(), Truk())

for (kendaraan in daftarKendaraan) {
kendaraan.mulai()
kendaraan.berhenti()
}
}

Dengan polimorfisme, kita dapat mendefinisikan kelas dasar Kendaraan dengan metode umum seperti mulai() dan berhenti(). Kemudian, kelas turunan seperti Mobil, Motor, dan Truk dapat mengoverride metode ini untuk memberikan implementasi khusus sesuai dengan jenis kendaraan.

Dengan pendekatan berorientasi objek ini, saat menambahkan jenis kendaraan baru, kita hanya perlu menambahkan kelas baru yang mengextend Kendaraan tanpa harus mengubah kode yang sudah ada. Ini tidak hanya meningkatkan modularitas tetapi juga memudahkan pemeliharaan dan peningkatan kode di masa depan.

Kesimpulan

Polimorfisme, dengan kemampuannya untuk memungkinkan satu tipe objek untuk digunakan sebagai tipe lain, adalah salah satu pilar dari pemrograman berorientasi objek. Pemahaman mendalam tentang polimorfisme dan penerapannya dengan benar dapat membantu pengembang dalam membangun aplikasi yang modular, mudah dikelola, dan siap untuk ekspansi di masa depan.

--

--

Arya Rezza

Android Developer & Content Writer • Banchelor of Computer Science • Reading with Coffee ☕