Wednesday, March 2, 2011

Beda Interface dan Abstract Class

Pertanyaan paling klasik dan sering dijadikan bahan pertanyaan tertulis di sekolah/kuliah/bahkan tempat kerja. Diharapkan sebelum membaca ini sudah punya knowledge tentang OOP (Object Oriented Programming) dan salah satu bahasa pemograman OOP.

It is just a theory. Practical is more important in programming.
Yap, sekedar membahas konsep dan teorinya, karena menurut saya ini penting. Tanpa teori tidak ada percobaan/praktek, begitu juga sebaliknya, tanpa praktek/percobaan nyata maka teori sama sekali tidak berguna!

Mungkin beberapa tau tentang perbedaan ini, yang jadi pertanyaan, kapan kita harus menggunakan interface?dan kapan kita harus menggunakan abstract class? Semoga pertanyaan ini telah terjawab ketika anda membaca artikel dibawah ini. Jika sudah tau, ya tidak perlu dibaca ^_^


Yang perlu diingat "Interface is not a class or an abstract class." It's totally different!"

Abstract class adalah sebuah class setengah jadi (abstrak) yang memuat/memiliki method dan atrribut.
Abstract class sebenarnya adalah sebuah class, sehingga memiliki semua sifat dari class biasa (punya konstruktor). Hanya saja sifatnya masih abstrak, karena itu biasanya method kosong/belum di implementasikan.
Namun Abstract class dapat mengimplementasikan method tersebut.
Abstract class akan selalu menjadi superclass / hirarki tertinggi dari subclass-subclass-nya.

Sedangkan interface:
- Adalah sebuah blok signature kumpulan method tanpa tubuh (konstan).
- Sebuah definisi method yang umum/general yang dapat menghubungkan class-class yang berbeda.
Dengan kata lain, interface memungkinkan kita mengimplementasikan method yang sama terhadap class yang tidak ada hubungan sama sekali (tidak dalam satu hirarki)
- Oleh karena itu interface bukanlah sebuah class, walaupun memiliki ciri yang serupa dengan abstract class.

Sebuah analogi yang bagus menurut saya adalah seperti ini:
- Abstract class adalah mobil, kapal, pesawat
class nya adalah Sedan, SUV, MPV, Sports, dll (untuk mobil)
- Interface adalah Kendaraan darat, kendaraan laut, kendaraan udara.
interface ini memiliki method-method/fungsi-fungsi umum ketiga jenis kendaraan tersebut, yang masing-masing fungsinya harus didefinisikan di class-class yang spesifik.

Kayanya kurang afdol kalo tanpa disertai contoh code nya, berikut saya ambil contoh dalam bahasa JAVA.
Contoh Interface:

public interface Relation
{
  public boolean isGreater( Object a, Object b);
  public boolean isLess( Object a, Object b);
  public boolean isEqual( Object a, Object b);
}
Contoh Interface yang di implements oleh class:

public class Line implements Relation
{
     public Line() {
     // constructor
     }
     public boolean isGreater( Object a, Object b){ // method di override dari interface
         double aLen = ((Line)a).getLength();
         double bLen = ((Line)b).getLength();
         return (aLen > bLen);
     }
     public boolean isLess( Object a, Object b){ // method di override dari interface
         double aLen = ((Line)a).getLength();
         double bLen = ((Line)b).getLength();
         return (aLen < bLen);
     }
     public boolean isEqual( Object a, Object b){ // method di override dari interface
         double aLen = ((Line)a).getLength();
         double bLen = ((Line)b).getLength();
         return (aLen == bLen);
     }
}
Contoh abstract class:
public abstract class LivingThing
{
   public void breath(){
   System.out.println("Living Thing breathing...");
}
public void eat(){
   System.out.println("Living Thing eating...");
}
/**
* abstract method walk
* Kita ingin method ini di-overridden oleh subclasses
*/
public abstract void walk();
}

Contoh abstract class yang di inherit:
public class Human extends LivingThing
{
         public void walk() {
         System.out.println("Human walks...");
        }
}
Didalam Java, C#, Object Pascal / Delphi, Smalltalk, dan PHP tidak memperbolehkan multiple inheritance (penurunan class dari superclass yang jumlahnya lebih dari 1). Semata-mata dihilangkan featurenya untuk menghindari ambigu. (Pada C++, Perl, Python, Lisp mensupport multiple inheritance). Walaupun begitu, semuanya kecuali Smalltalk memperbolehkan class untuk mengimplemen banyak interfaces (multiple interfaces).

Pesan singkat:
Gunakan interface untuk mendefinisikan method standar yang sama dalam class-class yang berbeda. Sekali kita telah membuat kumpulan definisi method standar(abstrak), kita dapat menulis method tunggal(spesifik) untuk memanipulasi semua class-class yang mengimplementasikan interface tsb.
Gunakan class abstract untuk mendefinisikan secara luas sifat-sifat dari class tertinggi pada hirarki OOP, dan gunakan subclassnya (turunannya/child class) untuk melengkapi deskripsi method dari class abstract.


Maaf kalo ada salah, hanya mau sharing aja, kalo salah dikoreksi ya ^^

13 comments:

  1. nice blog bro, makasih kunjungannya.....samal kenal dari review1st

    ReplyDelete
  2. @review1st thanks :)

    padahal uda gw tulis di blog ini, tapi lagi-lagi lupa dengan perbedaan interface dan abstract class karena kelamaan gak coding >_<

    ReplyDelete
  3. Mantab mas pesan singkat nya,.
    jadi mudeng neh when should be using abstract or interface,.
    pesan es jeruk juga mas :hammer

    ReplyDelete
  4. bagus nih artikelnya, cukup membantu..
    skalian mau tanya.

    double aLen = ((Line)a).getLength();

    itu maksudnya gimana ya?

    ReplyDelete
  5. thx Diaz untuk komentarnya. Dan maap baru mereply sangat lama.
    Untuk code "Line" disana, menunjukkan fungsi cast (konversi) ke object Line, karena parameter yang di passing merupakan sebuah "Object".
    Karena kebetulan code yang saya ambil ini dari contoh soal di text book, maka saya tidak mencantumkan attributes dari object yang ada.

    Semoga penjelasannya membantu dan mohon maaf kalo ada salah.

    ReplyDelete
  6. Bisa buat contoh masalah yang harus memakai interface?
    Help....

    ReplyDelete
  7. mantap mas..terima kasih sharing ilmunya

    ReplyDelete
  8. Aduuuhh... hihi... kalo secara teori rasanya ngerti tapi kenapa pas implementasinya susah banget ya... :D
    Pusing nih java, tapi bikin penasaran...haha...
    Lanjutkan mas blog, eh mas Yosep Gustri....

    ReplyDelete
  9. cara panggil abstract class di main programnya gmn ya ?
    kalau panggil constructor kan begini, contoh :
    Mobil m1 = new Mobil ("Kijang", "Hitam");

    ReplyDelete
  10. tku penjelasnnya gan.. semoga bermanfaat

    Salam,
    Hartoto
    http://www.xbasicpro.com

    ReplyDelete
  11. kerenn.. this article had open my mind

    Thanks for sharing

    ReplyDelete
  12. Cara panggil abstract class dari subclass adalah menggunakan keyword 'super', CMIIW

    ReplyDelete