Dalam tutorial sebelumnya, kita sudah belajar tentang inheritance. Dengan inheritance, kita belajar tentang pengelompokan class yang memiliki kemiripan ke dalam satu base class yang sama. Contoh untuk membuat game RPG, kita dapat mengelompokkan class karakter (Warrior, Assasin, Guardian, dll) ke dalam satu class parent bernama Hero. Kemiripan, penurunan sifat & kemampuan (method) itu dapat kita implementasikan misalnya :

  • Attack()
  • TakeDamage()
  • Heal()
  • Parry()
  • Counter()
  • dan lain-lain

Permasalahan muncul ketika ada class lain yang memiliki sifat dan atau kemampuan yang sama, tapi tidak dapat inherit suatu class. Sebagai contoh, seorang Guardian dapat mengeluarkan shield. Nah, shield tersebut juga memiliki HP dan dapat juga menerima damage. Akan tetapi, shield tidak dapat inherit Hero dan menggunakan method TakeDamage() karena shield bukanlah Hero.

Solusinya, kita tidak menggunakan inheritance untuk mengimplementasikan kemampuan yang dapat digunakan antar class, tetapi menggunakan interface. Dengan interface, kemampuan / method ekslusif yang awalnya milik suatu class, kita lepas menjadi komponen yang dapat dipakai semua class.


Pembuatan

Deklarasi interface sama seperti abstract class, yaitu hanya dengan menuliskan method tanpa implementasi.


interface IKillable {
    void Kill();
}

interface IDamageAble< T >
{
    void TakeDamage(float damage);
}

Huruf 'T' di atas adalah placeholder untuk tipe data yang akan dispesifikan oleh class yang mengimplementasi.


Implementasi

Pada saat deklarasi class kita juga sertakan interface apa saja yang akan dipakai. Jika class tersebut extends sekaligus implements, maka urutannya adalah parent class dulu, baru interfacenya. Terdapat dua cara implementasi interface, yaitu eksplisit dan non-eksplisit. Berikut perbedaan implementasinya :

Di atas adalah implementasi eksplisit. Ketentuannya adalah :

  • access specifier harus sama
  • memanggilnya perlu as dulu ke interface

Jika belum tahu, as mirip casting yang digunakan untuk merubah tipe data. Bedanya jika tidak ada yang sesuai, as akan mengembalikan null, sedangkan casting akan melempar exception.

Di atas adalah implementasi non-eksplisit. Access specifier dapat diubah sesuai kebutuhan, dan tak perlu lagi menggunakan as.


Materi Terkait