Selasa, 30 April 2013

Polimorfisme dan Inheritance


1. Polimorfisme

Polymorphism merupakan konsep OOP yang memberikan fleksibilitas kepada programmer dalam menulis program.  Dengan mengaplikasikan konsep polymorphism, programmer dapat memperlakukan seluruh object yang berasal dari superclass yang sama seakan-akan mereka adalah object dari superclass.
Pada Java, konsep polymorphism diimplementasikan melalui beberapa cara yaitu overloading, Overriding, abstract class dan melalui interface.

1.1     Polymorphism

Polymorphism berasal dari bahasa Yunani yang berarti banyak bentuk. Dalam PBO, konsep ini memungkinkan digunakannya suatu interface yang sama untuk memerintah obyek agar melakukan aksi atau tindakan yang mungkin secara prinsip sama namun secara proses berbeda.
Dalam konsep yang lebih umum sering kali polymorphism disebut dalam istilah satu interface banyak aksi. Contoh yang konkrit dalam dunia nyata yaitu mobil. Mobil yang ada dipasaran terdiri atas berbagai tipe dan berbagai merk, namun semuanya memiliki interface kemudi yang sama, seperti: stir, tongkat transmisi, pedal gas dan rem. Jika seseorang dapat mengemudikan satu jenis mobil saja dari satu merk tertentu, maka orang itu akan dapat mengemudikan hamper semua jenis mobil yang ada, karena semua mobil tersebut menggunakan interface yang sama.
Harus diperhatikan disini bahwa interface yang sama tidak berarti cara kerjanya juga sama. Missal pedal gas, jika ditekan maka kecepatan mobil akan meningkat, tapi bagaiman proses peningkatan kecepatan ini dapat berbeda-beda untuk setiap jenis mobil.Dengan menggunakan OOP maka dalam melakukan pemecahan suatu masalah kita tidak melihat bagaimana cara menyelesaikan suatu masalah tersebut (terstruktur) tetapi obyek-obyek apa yang dapat melakukan pemecahan masalah tersebut. Sebagai contoh anggap kita memiliki sebuah departemen yang memiliki manager, sekretaris, petugas administrasi data dan lainnya.
Misal manager tersebut ingin memperoleh data dari bag administrasi maka manager tersebut tidak harus mengambilnya langsung tetapi dapat menyuruh petugas bag administrasi untuk mengambilnya. Pada kasus tersebut seorang manager tidak harus mengetahui bagaimana cara mengambil data tersebut tetapi manager bisa mendapatkan data tersebut melalui obyek petugas adminiistrasi. Jadi untuk menyelesaikan suatu masalah dengan kolaborasi antar obyek-obyek yang ada karena setiap obyek memiliki deskripsi tugasnya sendiri.

1.1.1   Virtual Method Invocation (VMI)

Virtual Method Invocation (VMI) bisa terjadi jika terjadi polimorfisme 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 method. Berikut contoh terjadinya VMI:
Hasil dari running program diatas adalah sebagai berikut:
Nilai x =          5
Ini class Child

1.1.2   Polymorphic arguments

Polymorphic arguments adalah tipe suatu parameter yang menerima suatu nilai yang bertipe subclass-nya. Berikut contoh dari polymorphics arguments:

1.1.3 Pernyataan instanceof

Pernyataan instanceof sangat berguna untuk mengetahui tipe asal dari suatu polymorphic arguments. Untuk lebih jelasnya, misalnya dari contoh program sebelumnya, kita sedikit membuat modifikasi pada class Tes dan ditambah sebuah class baru Kurir, seperti yang tampak dibawah ini:

Seringkali pemakaian instanceof diikuti dengan casting object dari tipe parameter ke tipe asal. Misalkan saja program kita sebelumnya. Pada saat kita sudah melakukan instanceof dari tipe Manajer, kita dapat melakukan casting object ke tipe asalnya, yaitu Manajer. Caranya adalah seperti berikut:

1.2     Overloading

Overloading adalah suatu keadaan dimana beberapa method sekaligus dapat mempunyai nama yang sama, akan tetapi mempunyai fungsionalitas yang berbeda. Contoh penggunaan overloading dilihat dibawah ini:
·                     Parameter titik, untuk menggambar titik
Gambar(int t1)
·                     Parameter titik, untuk menggambar garis
Gambar(int t1,int t2)
·                     Parameter titik, untuk menggambar segitiga
Gambar(int t1,int t2,int t3)
·                     Parameter titik, untuk menggambar persegi empat
Gambar(int t1,int t2,int t3,int t4)

Overloading ini dapat terjadi pada class yang sama atau pada suatu parent class dan subclass-nya. Overloading mempunyai ciri-ciri sebagai berikut:
1. Nama method harus sama
2. Daftar parameter harus berbeda
3. Return type boleh sama, juga boleh berbeda

1.2.1   Overloading construktor

Tulislah listing program berikut ini dan amati yang terjadi pada saat terjadinya overloading pada method.
Kita dapat menyembunyikan information dari suatu class sehingga anggota-anggota class tersebut tidak dapat diakses dari luar.  Adapun caranya adalah cukup dengan memberikan akses kontrol private ketika mendeklarasikan suatu atribut atau method. Contoh:
private int nrp;
Contoh:
public class Siswa
{
private int nrp;
public void setNrp(int n)
{     nrp=n;            }
}

Konstruktor (konstruktor) adalah suatu method yang pertama kali dijalankan pada saat pembuatan suatu obyek. Konstruktor mempunyai ciri yaitu:
o          Mempunyai nama yang sama dengan nama class
o          Tidak mempunyai return type (seperti void, int, double, dan lain-lain)

Contoh:
public class Siswa
{     private int nrp;
private String nama;
public Siswa(int n, String m)
{     nrp=n;
nama=m;
}
}
Suatu class dapat mempunyai lebih dari 1 konstruktor dengan syarat daftar parameternya tidak boleh ada yang sama.

Contoh:
public class Siswa
{    
private int nrp;
private String nama;
public Siswa(String m)
{     nrp=0;
nama=””;
}
public Siswa(int n, String m)
{     nrp=n;
nama=m;    
}
}
Percobaan
Percobaan 1 : Melakukan enkapsulasi pada suatu class

Jika enkapsulasi dilakukan pada class diagram diatas, maka akan berubah menjadi:

Percobaan 2 : Melakukan overloading konstruktor


Dari class diagram tersebut, dapat diimplementasikan ke dalam program sebagai berikut:
public class Mahasiswa
{     private int nrp;
private String nama;
public Mahasiswa()
{     nrp=0;
nama=””;    }
public Mahasiswa(String nama)
{     nrp=0;
this.nama=nama;   }
public Mahasiswa(int nrp, String nama)
{     this.nrp=nrp;
this.nama=nama;   }
}

1.2.2   Melakukan overloading pada method

Tulislah listing program berikut ini dan amati yang terjadi pada saat terjadinya overloading pada method.

Ketika program tersebut dijalankan, akan tampak hasil seperti dibawah ini :
Buat segiempat dengan koordinat (25,25) dan (50,50)
Segiempat: <25 25="" 50="">
Buat segiempat dengan point (10,10) dan point (20,20):
Segiempat: <10 10="" 20="">
Buat segiempat dengan 1 point (10,10), koodinat (50,50)
Segiempat:<10 10="" 60="">

1.3   Overriding

Overriding adalah suatu keadaan dimana method pada subclass menolak method pada parent class-nya. Overriding mempunyai ciri-ciri sebagai berikut :
1.            Nama method harus sama
2.            Daftar parameter harus sama
3.            Return type harus sama
Berikut ini contoh terjadinya Overriding dimana method Info() pada class Child meng-override method Info() pada class parent:

Method yang terkena override (overridden method) diharuskan tidak boleh mempunyai modifier yang lebih luas aksesnya dari method yang meng-override (Overriding method).










2. Pewarisan (Inheritance)

Pewarisan adalah kemampuan sebuah kelas untuk mewariskan seluruh atau sebagian atribut dan methodnya ke kelas lain, sehingga atribut dan method tersebut dikenal oleh kelas yang menerima pewarisan tanpa harus menuliskannya. Pewarisan ini merupakan implementasi dari hubungan antar kelas generalisasi-spesialisasi.
Kelas yang mewariskan disebut kelas induk, super class, atau base class sedangkan kelas yang menerima pewarisan disebut kelas anak, kelas turunan, atau subclass.
Pewarisan dapat dilakukan jika :
              Ada beberapa atribut dan method yang sama yang digunakan oleh beberapa kelas berbeda (reduksi penulisan kode)
              Ada satu atau beberapa kelas yang sudah pernah dibuat yang dibutuhkan oleh aplikasi (reusability)
              Ada perubahan kebutuhan fungsional atau feature aplikasi dimana sebagian atau seluruh perubahan tersebut tercakup di satu atau beberapa kelas yang sudah ada (extend)

2.1   Pewarisan di Java

Pewarisan di Java hanya mengenal pewarisan tunggal, artinya sebuah kelas hanya mewarisi atribut dan method dari satu kelas induk. Untuk menggunakan pewarisan di Java digunakan keyword extends.

Contoh pewarisan dapat dilihat pada diagram kelas berikut ini:

Gambar 410 Contoh Pewarisan Kelas

Pada diagram kelas di atas, kelas Manager merupakan kelas turunan dari kelas Employee sehingga mewarisi semua atribut dan method dari kelas Employee yang bersifat public dan protected. Implementasi dari diagram kelas di atas dalam Java adalah sebagai berikut:

//Employee.java
public class Employee {
public String name;
      public Date birthDate;
      public double salary;
      public String getDetails() {...}
}
//Manager.java
public class Manager extends Employee {
      public String department;
}

Dari kode di atas, terlihat bahwa atribut name, birthDate, dan salary serta method getDetails() diturunkan ke kelas Manager sehingga kelas Manager dapat menggunakan atribut dan method tersebut. Konstruktor dari kelas induk tidak dapat diturunkan kepada kelas turunannya.
Untuk menggunakan method dan konstruktor dari kelas induk pada kelas anak digunakan keyword super, contoh:

//Employee.java
public class Employee {
private String name;
private double gaji;
public Employee (String s, double g) {
      name = s;
      gaji=g;
}
public double getgaji() {
      return gaji;
}
}
//Manager.java
public class Manager extends Employee {
private String alamat;
private double tunjangan;
private double bonus;
public Manager(String nama, String s) {
super(nama);
      alamat = s;
}
Public double getgaji() {
      return (super.getgaji()+tunjangan+bonus);
}
}

2.2   Kelas Abstrak

Kelas abstrak merupakan suatu bentuk khusus dari kelas di mana kelas tersebut tidak dapat diinstansiasi dan digunakan hanya untuk diturunkan ke dalam bentuk kelas konkret atau kelas abstrak berikutnya.
Kelas abstrak dideklarasikan menggunakan keyword abstract.
Di dalam kelas abstrak dapat dideklarasikan atribut dan method sama seperti kelas konkret, namun ada juga method abstrak, yaitu suatu method yang tidak mempunyai implementasi hanya memiliki deklarasi saja, contoh:
public abstract class LivingThing {
      public void breath(){
            Sistem.out.println("Living Thing breathing...");
      }

      public void eat(){
            Sistem.out.println("Living Thing eating...");
      }
public abstract void walk(); //merupakan method abstrak
}

Ketika sebuah kelas mewarisi sebuah kelas abstrak, kelas tersebut harus mendefinisikan implementasi dari method abstrak yang ada dalam kelas induknya. Jika tidak didefinisikan implementasinya, maka kelas tersebut akan menjadi kelas abstrak juga, contoh:

public class Human extends LivingThing {
      //implementasi dari method abstrak walk()
public void walk(){
            Sistem.out.println("Human walks...");
      }
}

2.3   Interface

Interface adalah prototype kelas yang berisi definisi konstanta dan deklarasi method (hanya nama method tanpa definisi kode programnya). Dalam sebuah interface:
-      Semua atribut adalah public, static dan final (semua atribut bertindak sebagai konstanta)
-      Semua method adalah abstract dan public
-      Tidak boleh ada deklarasi konstruktor
Interface digunakan untuk menyatakan spefisikasi fungsional beberapa kelas secara umum. Dengan adanya interface, Java menyediakan sebuah fitur untuk keperluan pewarisan jamak (Multiple inheritance).
Contoh interface dan kegunaannya:


Gambar 411 Contoh Interface

Untuk membuat interface di Java digunakan keyword interface. Source code untuk diagram kelas di atas dalam Java adalah sebagai berikut:


//Relation.java
public interface Relation {
  public boolean isGreater( Object a, Object b);
  public boolean isLess( Object a, Object b);
  public boolean isEqual( Object a, Object b);
}
//Line.java
public class Line implements Relation {
      private double x1;
      private double x2;
      private double y1;
      private double y2;
public Line(double x1, double x2, double y1, double y2){
      this.x1 = x1;    
      this.x2 = x2;    
      this.y1 = y1;          
      this.y2 = y2;    
      }
public double getLength(){
double length = Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)* (y2-y1));
      return length;
      }
public boolean isGreater( Object a, Object b){
      double aLen = ((Line)a).getLength();
      double bLen = ((Line)b).getLength();
      return (aLen > bLen);
      }
public boolean isLess( Object a, Object b){
      double aLen = ((Line)a).getLength();
      double bLen = ((Line)b).getLength();
      return (aLen < bLen);
      }
public boolean isEqual( Object a, Object b){
      double aLen = ((Line)a).getLength();
      double bLen = ((Line)b).getLength();
      return (aLen == bLen);
      }          
}

Untuk menggunakan interface dalam keperluan pewarisan jamak, dapat dilakukan dengan cara mengimplementasikan interface-interface yang bersangkutan, contohnya:
public class Person implements PersonInterface, LivingThing {
      //beberapa kode disini
      .........................................
      .........................................
}

Perbedaan abstract class dan interface antara lain:
1.            Semua interface method tidak memiliki body sedangkan beberapa abstract class dapat memiliki method dengan implementasi
2.            Sebuah interface hanya dapat mendefinisikan constant sedangkan sebuah abstract class tampak seperti class biasa yang dapat mendeklarasikan variabel
3.            Interface tidak memiliki hubungan inheritance secara langsung dengan sebuah class tertentu, sedangkan abstract class bisa jadi hasil turunan dari abstract class induknya
4.            Interface memungkinkan terjadinya pewarisan jamak (Multiple inheritance) sedangkan abstract class tidak