Object Oriented Programming: Polymorphism
- Pengertian Polymorphism
Polymorphism secara bahasa, memiliki makna “banyak bentuk” atau “bermacam-macam”. Dalam beberapa textbook, Polymorphism adalah konsep dimana suatu interface tunggal digunakan pada entity yang berbeda-beda, atau penggunaan suatu symbol tunggal untuk mewakili beberapa jenis tipe entity. Jika dilihat dari sisi teknis pada bahasa pemrograman, Polymorphism adalah menggunakan suatu fungsi atau attribute tertentu dari suatu base class untuk diimplementasikan oleh children class baik secara default maupun dimodifikasi sesuai dengan relevansi yang digunakan oleh masing-masing children class. Dari penjelasan-penjelasan tersebut dapat disimpulkan Polymorphism secara umum adalah penggunaan suatu item baik interface, fungsi, dan lain-lain pada berbagai maca jenis objek maupun entity yang berbeda-beda dengan syarat suatu objek atau entity tersebut memiliki relasi yang menjembatani agar akses ke item tersebut dapat didapatkan.
Dalam konteks Object Oriented Programming (OOP), Polymorphism terjadi ketika kita memiliki banyak class yang memiliki relasi satu sama lain menggunakan Inheritance. Seperti yang kita ketahui, Inheritance memungkinkan kita untuk menurunkan attribute, method atau fungsi pada class lainnya. Namun selain itu, dilihat dari sisi bahasa pemrograman pada umumnya, Polymorphism juga dapat diimplementasikan menggunakan baik menggunakan Inheritance maupun Interface.
Umumnya, Polymorphism digunakan untuk mengimplementasi suatu fungsi dari sebuah base class maupun Interface, baik fungsi yang abstract maupun sudah terdefinisi, untuk diimplementasikan sesuai dengan relevansi suatu class yang menggunakan Interface maupun Inheritance pada base class tersebut. Hal ini bertujuan untuk memberikan kebebasan kepada class yang menggunakan Interface atau Inheritance, untuk menggunakan fungsi sesuai dengan definisi aslinya maupun menyesuaikan fungsi tersebut dengan perilaku class itu sendiri tanpa perlu membuat fungsi khusus yang pada dasarnya hampir serupa dengan fungsi dari Interface atau Inheritance. Dengan kata lain, Polymorphism menggunakan fungsi tersebut untuk melakukan aksi yang berbeda-beda, sehingga kita dapat melakukan suatu aksi dengan cara yang berbeda-beda pula.
Namun, Polymorphism tidak hanya berpaku pada Inheritance maupun Interface saja, melainkan lebih luas lagi. Konsep seperti Function Overloading, Operator Overloading, Templates, juga merupakan implemetasi Polymorphism.
- Contoh Implementasi Polymorphism
Contoh sederhana konsep Polymorphism adalah bagaimana seekor hewan bersuara. Kita tahu bahwa setiap hewan mengeluarkan suara baik secara jelas maupun tidak, namun pada intinya hewan pasti bersuara. Jika kita konsepkan hewan bersuara sebagai fungsi, tentu fungsi ini akan diimplementasikan oleh makhluk hidup yang berada dalam kategori hewan secara berbeda-beda. Misalnya, kucing mengimplementasikan fungsi ini dengan suara “Meong”, anjing mengimplementasikan dengan suara “Gug gug”, ular mengimplmentasikan dengan suara “Hshshhss”, sapi mengimplementasikan dengan suara “Mooo”, dan lain-lain. Perbedaan dalam implmentasi dari suatu fungsi yang sama inilah yang menjadi salah satu contoh penerapan Polymorphism.
- Sejarah Polymorphism
Konsep Polymorphism tidak langsung muncul begitu saja dalam dunia pemrograman dan sains komputer, melainkan melalui proses riset dari contributor yang berpengaruh. Pada era tahun 1960-an, Polymorphism mulai dikembangkan secara signifikan sebagai type system dan implementasi secara praktiknya mulai muncul pada akhir tahun 1970-an. Type system adalah suatu sistem logika yang terdiri dari kumpulan aturan yang terdaftar pada suatu property yang disebut dengan type untuk mengkonstruksi berbagai macam program komputer, seperti variable, expression, fungsi, dan module.
Ad Hoc Polymorphism dan Parametric Polymorphism adalah tipe polymorphism yang menjadi awal dari type system Polymorphism. Kedua tipe tersebut notasikan dan dijelaskan pada lecture notes Fundamental Concepts in Programming Languages oleh Christopher Strachey. Ad Hoc Polymorphism digunakan pada bahasa pemrograman Algol 68, dan Parametric Polymorphism digunakan pada bahasa pemrograman ML (Meta Language). Pada tahun 1985, Peter Wegner dan Luca Cardelli memperkenalkan suatu term yang disebut dengan Inclusion Polymorphism untuk memodelkan konsep Subtypes dan Inheritance, dan diimplementasikan pertama kali pada bahasa pemrograman Simula.
- Tipe-tipe Polymorphism
- Ad Hoc Polymorphism
Tipe Ad Hoc Polymorphism adalah type system Polymorphism yang diperkenalkan oleh Christopher Strachey. Tipe Polymorphism ini adalah tipe Polymorphism dimana suatu fungsi dapat diaplikasikan dengan berbagai argument atau parameter yang berbeda. Konsep ini juga disebut dengan Function Overloading atau Operator Overloading. Tipe ini memungkinkan suatu aksi fungsi diimplementasikan berbeda-beda berdasarkan argument atau parameter apa yang dimasukkan pada fungsi.
- Parametric Polymorphism
Tipe Polymorphism ini memungkinkan suatu fungsi atau data dituliskan secara general/umum, sehingga dapat memproses nilai secara seragam tanpa memperhatikan tipe yang digunakan. Contoh dari penggunaan Polymorphism tipe ini adalah pada Templates yang ada di bahasa pemrograman C++, dan Generics pada bahasa pemrograman C# dan Java.
- Subtyping
Tipe ini juga disebut dengan Subtype Polymorphism atau Inclusion Polymorphism. Tipe inilah yang umumnya kita gunakan saat kita menggunakan Inheritance dan Interface. Tipe ini memungkinkan suatu fungsi dari base class atau interface untuk diimplementasikan secara sama maupun berbeda dengan base class atau interface tersebut pada suatu children class.
- Row Polymorphism
Yaitu tipe Polymorphism yang secara konsep umum mirip dengan Subtyping, namun lebih berurusan pada structural types. Tipe ini memungkinkan untuk melakukan operasi hanya pada suatu bagian dari sebuah record/data. Misalnya ada suatu fungsi transform2D : {x: Float, y : Float, p}, yang mentransformasi titik dua dimensi dan dimana p adalah class/type yang memiliki attribute float x dan float y. Fungsi transform2D ini dapat digunakan pada setiap class/type yang memiliki attribute setidaknya float x dan float y. Sehingga jika kita memiliki titik tiga dimensi atau lebih, masih dapat menggunakan fungsi transform2D tersebut.
- Polytypism
Tipe ini adalah konsep yang lebih umum dari Polymorphism, namun masih ada keterkaitan dengan Polymorphism karena memiliki kemiripan konsep. Polytypism bertujuan untuk menyediakan definisi general pada suatu fungsi menggunakan induksi pada strukture dari sebuah type. Contohnya adalah Generic Haskell yang merupakan extensi dari bahasa Haskell.
- Static and Dynamic Polymorphism
Umumnya ada dua aspek implementasi Polymorphism, yaitu Static Polymorphism dan Dynamic Polymorphism. Static Polymorphism adalah Polymorphism yang dilakukan pada waktu compile (compile time), sedangkan Dynamic Polymorphism adalah Polymorphism yang dilakukan pada waktu berjalannya program (runtime). Static Polymorphism bekerja lebih cepat, namun membutuhkan bantuan compiler tambahan. Sedangkan Dynamic Polymorphism lebih flexible contohnya dimana objek dioperasikan tanpa mengetahui secara penuh type dari objek tersebut, namun Dynamic Polymorphism bekerja lebih lambat dari pada Static Polymorphism.
Contoh Static Polymorphism adalah Static Binding, Compile-Time Binding, Early Binding, dan Method Overloading pada suatu class. Contoh Dynamic Polymorphism adalah Dynamic Binding, Run-Time Binding, Late Binding, Method Overriding pada class-class yang berbeda.
- Contoh Polymorphism dalam Bahasa Pemrograman Java
Pada contoh sederhana berikut, saya menggunakan Polymorphism tipe Subtyping Polymorphism dimana class Enemy merupakan super class dari class Ninja dan class Monster. Ada satu fungsi pada class Enemy yaitu Attack yang akan menge-print serangan textual dimana diimplementasikan berbeda-beda oleh child class-nya.
Code (Main.java) |
class Enemy { public void attack() { System.out.println(“Enemy is attacking!”); } }
class Ninja extends Enemy { public void attack() { System.out.println(“Ninja is throwing shurikens!”); } }
class Monster extends Enemy { public void attack() { System.out.println(“Monster goes berserk!”); } }
public class Main { public static void main(String []args) { Enemy e1 = new Enemy(); Enemy e2 = new Ninja(); Enemy e3 = new Monster();
e1.attack(); e2.attack(); e3.attack(); } } |
Output |
Enemy is attacking! Ninja is throwing shurikens! Monster goes berserk! |
Penulis:
- Yogi Udjaja
- Nauval Muhammad Firdaus