You are on page 1of 13

Polymorphism

Polymorphism merupakan konsep pokok di dalam perancangan berorientasi objek. Polymorphism berarti mempunyai banyak bentuk, dua objek atau lebih dikatakan sebagai polymorphic bila objek-objek itu mempunyai antarmuka yang identik namun mempunyai perilaku-perilaku berbeda. Polymorphism berupa satu nama tunggal (seperti deklarasi fungsi) dan dapat menyatakan objek kelas-kelas berbeda yang terhubung dengan suatu superkelas yang common diantara kelas-kelas itu. Sembarang objek yang ditandai dengan nama ini dapat menanggapi sekumpulan operasi yang common. Polymorphism merupakan fitur yang ada karena interaksi konsep pewarisan dan Dynamic Binding. Polymorphism merupakan fitur penting dan ampuh bahasa pemrograman berorientasi objek. Kepentingannya merupakan peringkat kedua setelah dukungan terhadap abstraksi berorientasi objek. Fitur ini merupakan pembeda pemrograman berorientasi objek dari bahasa pemrograman tradisional yang hanya sampai pada tipe data abstrak. Bahasa yang tidak mendukung Polymorphism belum layak disebut bahasa pemrograman berorientasi objek, paling-paling disebut bahasa berbasis objek bila telah mendukung pengkapsulan. Polymorphism memungkinkan kita mengenali dan mengeskploitasi keserupaankeserupaan di antara kelas-kelas berbeda. Ketika kita mengenali bahwa beberapa jenis objek dapat menanggapi pesan yang sama, kita mengenali tidak adanya pembeda antara nama pesan dan metode. Objek mengirim pesan, jika penerima mengimplementasikan metode dengan penanda sama, maka objek itu akan memberi tanggapan khasnya. Tanggapan-tanggapan yang berbeda dimungkinkan, metode-netode yang berbeda dari instan kelas-kelas berbeda. Pengirim cukup mengirim pesan, tidak peduli dengan kelas dari objek penerima. Polymorphism memungkinkan kita menganggap sekelompok objek dengan tipetipe berbeda seperti dimiki oleh tipe yang sama. Pemakai objek-objek itu tidak perlu mengetahui atau peduli, perhatian mengenai perbedaan-perbedaan itu. Ketidakpedulian ini

membantu kita mengelola kompleksitas. Kompleksitas yang disebabkan adanya perbedaanperbedaan pada kelompok objek itu menjadi tidak relevan untuk diperhatikan/diperdulikan. Polymorhism merupakan konsep OOP dimana variable/method dari sebuah kelas, dipanggil ulang pada kelas turunannya dengan perilaku yang berbeda-beda antar tiap kelas. Perhatikan contoh gambar berikut ini:

Setiap hewan memiliki suara. Namun suara pada masing-masing hewan berbeda beda. Perilaku yang class berbeda-beda Utama. Seperti itulah halnya yang menjadi di ciri khas polymorphism. Penggunaan teknik polymorphism dapat diketahui melalui pembuatan instance-of-class pada gambar atas, maka pendeklarasian objek yang dibuat (di-instanskan) berasal dari class induknya, yakni class Hewan. Sehingga objek tersebut berbentuk array-of-class .

Prinsip Substitusi Liskov Polymorphism dapat bermacam variasi. Polymorphism dapat berupa total polymorphism atau partial polymorphism, serta dapat berupa typed polymorphism atau untyped polymorphism. Kombinasinya membentuk empat jenis Polymorphism. 1. Total Polymorphism

Objek A adalah Polymorphism secara total ke objek B jika segala sesuatu yang dapat dilakukan terhadap B dapat juga dilakukan terhadap A. Dengan demikian A menggantikan B dalam sembarang konteksnya. 2. Partial Polymorphism

Pada jenis ini, hanya pada beberapa konteks (tidak semuanya) yang mengijinkan A mengganti B, tapi tidak unutk konteks-konteks yang lain. 3. Typed Polymorphism

Polymorphism jenis ini didasarkan pada type yang dideklarasikan dari kelas-kelas objek. Di C++, jika A menuruni dari B lewat pewarisan, maka A akan mempunyai typed information dengan B. 4. Untyped Polymorphism

Polymorphism jenis ini muncul ketika A dan B terhubung hanya karena antarmuka serupa. Jenis Polymorphism ini dapat diperoleh di C++ menggunakan fasilitas template. Untuk penerapan Polymorphism total yang baik adalah mengikuti prinsip substitusi Liskov. Prinsip substitusi liskov mendeskripsikan mengenai property total polymorphism. Kita menggunakan prinsip ini dalam hirarki is-a. Setiap kali kita menggunakan extends, maka kita menjamin subkelas-subkelas yang didefinisikan merupakan subtype sesungguhnya menurut substitusi liskov. Dengan kata lain yang kurang formal adalah kita selalu dapat melewatkan reference kelas turunan ke fungsi mengharapkan reference kelas induk/basis.

Inilah keampuhan, yaitu terhadap fungsi yang mengharapkan reference kelas basis, maka pemrograman memperoleh jaminan tidak perlu khawatir mengenai kasus-kasus special untuk sembarang penurunan kelas basis. Pemrograman dapat menggunakan argument kelas basis tanpa takut akan dikelabui oleh kelas-kelas turunan. Fungsi terhadap reference kelas basis akan berlaku untuk seluruh kelas-kelas turunan dari kelas itu. Hal ini merupakan sarana ampuh untuk mengelola kompleksitas. Objek yang bertindak sendirian jarang berguna, kebanyakan objek memerlukan objek-objek lain untuk melakukan banyak hal. Objek-objek memerlukam suatu tipe makanisme komunikasi untuk saling berinteraksi. Objek-objek perangkat lunak saling berinteraksi dan berkomunikasi lewat pesan. Ketika berkomunikasi objek mengirim pesan untuk memberi tahu agar objek lain melakukan sesuatu yang diharapkannya. Seringkali pengiriman pesan juga disertai informasi untuk memperjelas apa yang dikehendaki. Informasi yang dilewatkan beserta pesan ini adalah parameter pesan. Operasi yang sama dapat diterapkan kebanyak kelas berbeda, disebut polymorphic, yaitu operasi sama tapi mengambil cara berbeda pada kelas-kelas berbeda. Operasi dapat despesifikasi dengan beragam cara, yaitu: Prakondisi dan poskondisi Fungsi-fungsi matematika seperti trigonometri Table nilai masukan dan keluaran untuk himpunan terbatas Persamaan yang menspesifikasikan keluaran dalam argument masukan Table-table keputusan Pseudo code Bahasa alami

Spesifikasi ooperasi terdiri dari: Penanda

Penanda mendefinisikan antarmuka operasi berupa nama, argument yang diperlukan (jumlah, urutan dan type) dan nilai yang dikembalikan (jumlah, urutan dan type). Operasi biasanya didaftarkan untuk menunjukkan pola pewarisan, penanda semua metode yang diimplementasikan operasi harus cocok (match). Transformasi Transformasi mendefinisikan efek-efek operasi: nilai-nilai keluaran adalah fungsi nilai-nilai masukan dan side-effect operasi pada objek-objek operan. Tujuan spesifikasi operasi adalah mengindikasikan apa yang dilakukan operasi secara logic, bukan bagaimana cara implementasi. yang terlihat Spesifikasi dari luar operasi operasi. hanya Selama mendeskripsikan perubahan-perubahan

implementasi operasi, nilai-nilai internal boleh diciptakan. Beberapa nilai mungkin bagian internal state objek. Rincian-rincian internal private ke operasi itu (dan mungkin di kelas objek) dan tidak mucul di spesifikasi eksternal.

Kriteria penggunaan Polymorphism Dalam penggunaan polymorphism, ada 2 kriteria yang harus dipenuhi, antara lain: - Method dari kelas turunan yang akan dieksekusi, dipanggil oleh objek dari kelas induk. - Nama method yang digunakan pada kelas induk harus ditulis ulang (overriding method) pada kelas turunann ya, den gan asumsi nama dan tipe data method harus sama.

Contoh Sebagai contoh dalam class Employee didefinisikan method print() : class Employee { ... public void print() { System.out.println(name + " " + salary + " " + hireYear()); } Selanjutnya dalam class Manager yang merupakan turunan (lebih dikenal dengan istilah sub-klas) juga didefinisikan method print() yang isinya berbeda dengan method print() pada kelas Employee sbb : class Manager extends Employee { ... public void print() { super.print(); System.out.println("his secretary is : "+secretaryName); } Perhatikan isi method print() pada kelas Manager baris pertama memanggil method print() dari object super (dalam hal ini objek super adalah objek Employee, yang merupakan super kelas atau induk dari kelas Manager). Setelah melaksanakan print() dari objek super dilanjtkan dengan mencetak nama sekretaris. Dengan demikian pada saat pemanggilan method print() maka kompiler akan melihat objek mana yang dimaksud, misalnya :

Manager boss =new Manager("Harry Hacker",100000,new

Day(1982,10,1)); boss.setSecretaryName("JEANET JACKSON"); staff[1] = new Employee("Carl Cracker", 75000, new Day(1987,12,15)); Perhatikan bagian program: staff[i].print() dalam main() Untuk i=0 maka staff[i] adalah objek dari kelas Manager sehingga method print() yang dikerjakan adalah dari kelas Manager (dengan mencetak nama sekretaris) Untuk i=1 dan i=2 maka staff[i] adalah objek dari kelas Employee sehingga method print() yang dikerjakan adalah method print() dari kelas Employee. Hal ini ditunjukkan oleh output program. Satu konsep yang menaraik adalah bahwa suatu objek dari super-kelas Dapat diassign (diberikan )pada objek dari sub-kelas, seperti pernyataan : staff[0]=boss ; class Employee class Manager

Hal ini tidak dapat berlaku sebaliknya. Pernyataan boss=staff[0] akan menimbulkan error. Dalam contoh program class Manager dan class Employee juga ada polymorphism untuk method raiseSalary(double byPercent), dimana untuk kelas Employee perhitungan adalah kenaikan salary adalah sebesar (byPercent/100)*salary awal, sedangkan rumus untuk kelas Manager (byPercent+bonus)/100 * salary awal. Sedangkan untk bonus dihitung sebesar setengah masa kerja (bonus = 0.5 * (today.getYear() hireYear());

Virtual Method Invocation

Virtual method invocation merupakan suatu hal yang sangat penting dalam konsep polimorfisme. Syarat terjadinya VMI adalah sebelumnya sudah terjadi polymorphism dan overriding. Pada saat obyek yang sudah dibuat tersebut memanggil overridden method pada parent class, kompiler Java akan melakukan invocation (pemanggilan) terhadap overriding method pada subclass, dimana yang seharusnya dipanggil adalah overridden.

Contoh Virtual Method Invocation class Employee{} class Manager extends Employee{} Class Tes{ Employee emp = new Manager(); emp.info(); } Virtual Method Invocation Yang terjadi pada contoh: Obyek e mempunyai behavior yang sesuai dengan runtime type bukan compile type. Ketika compile time e adalah Employee. Ketika runtime e adalah Manager. Jadi : 1. emp hanya bisa mengakses variabel milik Employee. 2. emp hanya bisa mengakses method milik Manager

Virtual Method Invocation

Bagaimana dengan konstruktor yang dijalankan? Pada pembentukan Employee e = new Manager(); Pertama kali akan menjalankan konstruktor Manager, ketika ketemu super() maka akan menjalankan konstruktor Employee (superclass), setelah semua statement dieksekusi baru kemudian menjalankan konstruktor Manager (subclass). Polymorphic Arguments Polymorphic arguments adalah tipe data suatu argumen pada suatu method yang bisamenerima suatu nilai yang bertipe subclassnya. Contoh class Pegawai { } class Manajer extends Pegawai { } public class Tes { public static void Proses(Pegawai peg) { } public static void main(String args[]) { Manajer man = new Manajer(); Proses(man); } }

Operator instanceof Pernyataan instanceof sangat berguna untuk mengetahui tipe asal dari suatu polymorphic arguments Contoh class Kurir extends Pegawai { } public class Tes { public static void Proses(Pegawai peg) { if (peg instanceof Manajer) { lakukan tugas-tugas manajer } else if (peg instanceof Kurir) { lakukan tugas-tugas kurir } else { lakukan tugas-tugas lainnya } } public static void main(String args[]) { Manajer man = new Manajer(); Kurir kur = new Kurir(); Proses(man); Proses(kur); } }

Casting object

Seringkali pemakaian instanceof diikuti dengan casting object dari tipe parameter ketipe asal. Tanpa adanya casting obyek, maka nilai yang akan kita pakai setelah proses instanceof masih bertipe parent class-nya, sehingga jika ia perlu dipakai maka ia harus di casting dulu ke tipe subclass-nya. Contoh if (peg instanceof Manajer) { Manajer man = (Manajer) peg; lakukan tugas-tugas manajer } Kenapa diperlukan polymorphic arguments? Mengefisienkan pembuatan program Misal Employee mempunyai banyak subclass. Maka kita harus mendefinisikan semua method yang menangani behavior dari masing-masing subclass. Dengan adanya polymorphic arguments kita cukup mendefinisikan satu method saja yang bisa digunakan untuk menangani behavior semua subclass. Tanpa polymorphic arguments Contoh public class Tes { public static void ProsesManajer() { lakukan tugas-tugas manajer } public static void ProsesKurir() { lakukan tugas-tugas kurir } }

Kesimpulan Polymorphism
Polymorphism memungkinkan kita mengenali dan mengeskploitasi keserupaankeserupaan di antara kelas-kelas berbeda. Ketika kita mengenali bahwa beberapa jenis objek dapat menanggapi pesan yang sama, kita mengenali tidak adanya pembeda antara nama pesan dan metode. Objek mengirim pesan, jika penerima mengimplementasikan metode dengan penanda sama, maka objek itu akan memberi tanggapan khasnya. Tanggapan-tanggapan yang berbeda dimungkinkan, metode-netode yang berbeda dari instan kelas-kelas berbeda. Pengirim cukup mengirim pesan, tidak peduli dengan kelas dari objek penerima. Polymorphism dapat bermacam variasi. Polymorphism dapat berupa total polymorphism atau partial polymorphism, serta dapat berupa typed polymorphism atau untyped polymorphism. Kombinasinya membentuk empat jenis Polymorphism. 5. 6. 7. 8. Total Polymorphism Partial Polymorphism Typed Polymorphism Untyped Polymorphism

Untuk penerapan Polymorphism total yang baik adalah mengikuti prinsip substitusi Liskov. Prinsip substitusi liskov mendeskripsikan mengenai property total polymorphism. Kita menggunakan prinsip ini dalam hirarki is-a. Setiap kali kita menggunakan extends, maka kita menjamin subkelas-subkelas yang didefinisikan merupakan subtype sesungguhnya menurut substitusi liskov. Dengan kata lain yang kurang formal adalah kita selalu dapat melewatkan reference kelas turunan ke fungsi mengharapkan reference kelas induk/basis.

KATA PENGANTAR

Puji syukur penyusun panjatkan ke hadirat Allah Subhanahu wataala, karena berkat rahmat-Nya kami dapat menyelesaikan makalah yang berjudul Polymorphism. Makalah ini diajukan guna memenuhi tugas mata kuliah Pemrograman Berorientasi Objek. Kami mengucapkan terima kasih kepada semua pihak yang telah membantu sehingga makalah ini dapat diselesaikan sesuai dengan waktunya. Makalah ini masih jauh dari sempurna, oleh karena itu kami mengharapkan kritik dan saran yang bersifat membangun demi kesempurnaan makalah ini. Semoga makalah ini memberikan informasi dan bermanfaat untuk pengembangan ilmu pengetahuan bagi kita semua. Bengkulu, April 2012

Penyusun

You might also like