:: abstract class + interface :: abstract class Saat kita membuat sebuah superclass, kita tahu bahwa kita dapat memakai semua metode yang dimilikinya pada class anaknya. Atau kalau kita butuh metode tersebut diperbarui, kita tinggal melakukan override pada metode tersebut. Tapi, pada suatu kasus, kita ingin membuat superclass yang bernama LivingThing(makhluk hidup). Class ini punya beberapa method yang sudah kita kenal seperti makan, bernafas, tidur, dan berjalan. Ada satu metode yang tidak dapat kita generalisasi. Contohnya adalah method berjalan. Human sebagai subclass dari makhluk hidup berjalan dengan 2 kaki, sedangkan Dog berjalan dengan 4 kaki. Untuk membuat superclass yang umum, kita bisa membuat suatu superclass yang memiliki beberapa metode dengan implementasi dan beberapa tidak. Class ini disebut abstract class.
Secara umum, abstract class adalah class yang tak dapat diinstansiasi. Biasanya abstract class berada dalam hierarki tertinggi dalam PBO (pemrograman berorientasi objek). Metode di dalam abstract class yang tidak berisi kode program adalah abstract method (metode abstract). Nantinya, method ini harus di-override oleh subclass-nya. Jadi, kita hanya menulis deklarasi method tanpa tubuh metode dan memakai keyword abstract. Contohnya: public abstract void iniMetode();
Deklarasi Method ini disebut sebagai prototype method. Sekarang, kita coba buat abstract class pertama kita:
1
Suatu metode yang sudah dideklarasikan abstract harus diakhiri tanpa memakai tubuh program. Jika ditulis seperti ini:
maka akan terjadi error seperti berikut:
Ketika sebuah class dibuat sebagai subclass dari class LivingThing, class itu harus meng-override metode abstract walk(). Jika tidak, class tersebut tidak akan dapat dikompilasi dan akan terjadi error. Contoh pembuatan subclass yang benar:
Jika class Human tidak meng-override metode walk(), maka akan muncul pesan error seperti berikut:
2
Tapi, walau class Human tidak meng-override metode yang lain seperti breath() dan eat() (yang tidak abstract) tidak akan terjadi error. Jadi, fungsi abstract class tak lain adalah untuk membuat prototype bagi class di tingkatan paling atas dalam hierarki class dan subclass-nya yang menyediakan detail implementasi dari abstract class tersebut.
Question • •
Apakah sebuah class biasa bisa memiliki abstract method? Apakah abstract class boleh tidak memiliki abstract method? Silahkan analisis secara mandiri. Bagaimana jika class LivingThing memiliki sebuah constructor? (Mengingat bahwa abstract class tidak bisa diinstansiasi) Bisakah? Jika bisa, apakah fungsi dan penggunaannya sama dengan class yang lain?
3
:: interface interface adalah sebuah blok yang berisi deklarasi metode saja untuk diimplementasikan pada class lain. Jadi, metode yang ada di dalam interface tidak memiliki kode program (bersifat abstract). Contoh interface:
Interface ini nantinya berguna untuk membuat satu subclass memiliki lebih dari satu superclass. Tapi bukan secara extends (inheritance), tapi implements (implementasi). Coba kita buat class line yang mengimplementasikan interface Relation di atas.
Jika salah satu dari method isGreater(), isLess() atau isEqual() dihilangkan dari class Line ini, maka akan terjadi error yang mengharuskan kita meng-override semua metode tersebut (benarkah?). Ini disebabkan karena semua metode yang dideklarasikan di interface harus dioverride oleh class yang mengimplementasikannya. Kenapa serepot itu? Ini sesuai dengan salah
4
satu fungsi interface Æ membuat suatu class yang bisa diimplementasikan oleh berbagai class lain yang tidak berelasi sama sekali. Untuk latihan, misalkan kita mengimplementasikan interface Radio dan Kamera pada class Handphone seperti di bawah ini:
Fungsi interface sebetulnya cukup jelas adalah untuk membuat satu template untuk class yang ingin mengimplementasikannya supaya sama dengan template. Atau dengan kata lain, ada standarisasi dalam mengimplementasikan suatu interface.
Question -
Nah interface hanya dapat diisi dengan deklarasi method saja… Benarkah? Silahkan lakukan analisis mandiri. Semua method di interface adalah abstract. Apakah bisa ditambahi dengan keyword abstract pada setiap method-nya? Sama saja atau jadi berbeda?
5
:: interface vs abstract class Perbedaan interface dan abstract class cukup terlihat dari pemakaiannya. interface itu diimplementasikan dan abstract class itu diturunkan (diwariskan). Keduanya dapat dipakai bersamaan dalam satu class. Misalkan seperti contoh di bawah ini:
Tambahkan abstract class di atas ke class HandPhone yang sudah kita buat, sehingga class HandPhone menjadi:
Question •
Apakah kita bisa membuat class baru yang extends dari class HandPhone? Apakah perlu untuk meng-override semua metodenya juga?
6
Exercise Buat suatu class Compo yang mengimplementasikan interface Radio dan Tape seperti Class Diagram di bawah ini. Kemudian buatlah sebuah launcher class untuk mencobanya.
Buatlah abstract class AlatMusik dan diturunkan ke dua class, yaitu class MusikTiup serta class MusikGesek seperti class diagram di bawah ini. AlatMusik (abstract)
+setNamaAlat(nama: String) +setBunyi(bunyi: String) +getInfo()
MusikTiup
MusikGesek
-bunyi: String -namaAlat: String
-bunyi: String -namaAlat: String -jumDawai: Integer
+MusikTiup()
+MusikGesek()
Tulislah juga suatu launcher class yang membuat sebuah objek terompet yang merupakan instance dari class MusikTiup yang memiliki atribut bunyi “toet-toet”. Buatlah pula sebuah objek biola yang merupakan instance dari class MusikGesek yang memiliki atribut bunyi “ngik-ngok” dan jumlah dawai 4 buah. Setiap kali membuat objek baru
7