Abstract

Abstract Base Class

Mari kita kembali ke contoh SearchEngine kita. Class SearchEngine mengindikasikan bahwa semua dan setiap objek bertipe SearchEngine memiliki kemampuan untuk search. Tetapi, melihat kembali kode kita, base class SearchEngine tidak melakukan hal yang berguna. Kita hanya memberikan implementasi 'dummy' yang tidak melakukan apapun selain menghabiskan waktu menuliskan kode tidak berguna.

Pada kasus seperti ini, daripada memberikan implementasi 'dummy', kita punya pilihan untuk tidak memberikan implementasi apapun. Dengan tidak adanya implementasi ataupun body dari method, method tersebut menjadi abstract.

Untuk mencapai ini dalam kode, kita perlu menambahkan keyword abstarct ke class kita, dan juga semua method yang kita ingikan tidak memiliki implementasi di base class.

public abstract class SearchEngine
{
    public abstract string[] Search(string cariIni);
}

Ketika sebuah class abstract, ia boleh untuk memasukkan method abstract. Abstract method tidak dapat dimasukkan dalam class regular, non-abstract. Ketika sebuah class ditandai abstract, kalian tidak dapat membuat instance apapun dari class tersebut secara langsung. Sebagai gantinya, kalian perlu membuat instance dari suatu class turunan yang tidak abstract.

Jadi dengan kode diatas, kalian tidak dapat membuat instance dari SearchEngine. Tetapi, kalian perlu membuat instance dari salah satu class turunan seperti GoogleSearch atau FafaSearchEngine.

Pada kode diatas, kalian juga dapat melihat bahwa method di tandai dengan abstract juga. Pada kasus ini, method tidak perlu memiliki body method, dan tidak diperbolehkan untuk memilikinya. Alih-alih memberikan implementasi dengan kurung kurawal di bawahnya, kalian hanya memberi titik koma pada akhir baris.

Abstract class dapat juga memiliki sebanyak apapun virtual method yang kalian inginkan.

Pada class turunan, untuk memberikan implementasi dari suatu abstract method, kalian harus menggunakan keyword override dengan cara yang persis seperti yang sudah kita lakukan untuk virtual method.

Keyword 'new' dengan Method

Ada topik satu lagi yang banyak orang terjebak dengan semua override dan virtual yang sudah kita bahas, dan itu adalah memberi keyword new pada suatu method.

Kalian diperbolehkan untuk menggunakan keyword new pada method seperti ini:

public new string[] Search(string cariIni)
{
    // ...
}

Ketika kalian menggunakan keyword new seperti ini, apa yang kalian maksud adalah, "Aku ingin membuat method baru yang ada di class turunan ini, yang sama sekali tidak ada hubungannya dengan method apapun dengan nama yang sama pada base class." Pada contoh ini method Search sama sekali tidak ada hubungannya dengan method Search pada class SearchEngine.

Ini biasanya adalah ide yang buruk karena ini berarti bahwa kita sekarang punya dua method yang tidak berhubungan, tetapi nama dan signaturenya sama. Conflict nama ini dapat diselesaikan, tetapi lebih baik untuk dihindari sepenuhnya.

Orang-orang biasanya tidak dapat membedakan keyword new ini dengan overriding method virtual dan abstract untuk dua alasan. Satu, karena terlihat mirip. Keyword new disini dapat digunakan dengan sama persis seperti override. Kedua, Jika kalian lupa untuk mengisi apa pun (new atau override) ketika kalian ingin menggunakan method dengan signature sama, kalian akan mendapatkan warning/peringatan yang akan memberi tahu untuk menambahkan keyword new atau override. (atau dalam kasus tertentu, hanya akan menyebutkan keyword new). Orang melihat warning ini dan berpikir, "Hmm.. Mungkin saya harus menambah keyword new agar peringatan nya hilang."

Intinya, kalian akan jarang untuk menggunakan keyword new. Bukan itu yang kalian cari. Jika kalian memang benar-benar mencoba untuk membuat method baru yang tidak berhubungan, pertimbangkan untuk menggunakan nama berbeda sebagai ganti.

Last updated