1. Kelas dasar umum

Hari ini kita akan menikmati hamparan topik menarik. Ingat ketika kami memperkenalkan ChessItemkelas dasar untuk menyederhanakan semua kelas yang mewakili bidak catur? Saya harap begitu 🙂

Sekarang bayangkan setiap bagian memiliki draw()metode yang menangani menggambarnya di layar. Anda memanggil draw()metodenya, dan bidak itu menggambar dirinya sendiri pada koordinatnya saat ini. Akan lebih mudah untuk memindahkan metode ini ke kelas dasar.

Jika draw()metodenya ada di kelas dasar ChessItem, maka kita bisa menimpanya di kelas bidak dan menulis kode elegan seperti ini:

class ChessBoard
{
   public void drawAllChessItems()
   {
      // Add the pieces to the list
      ArrayList<ChessItem> items = new ArrayList<ChessItem>();
      items.add(new King());
      items.add(new Queen());
      items.add(new Bishop());

      // Draw them regardless of their type
      for(ChessItem item: items)
      {
         item.draw();
      }
   }
}

Dengan memperkenalkan ChessItemkelas dasar, kami dapat sangat menyederhanakan kode: tidak perlu memanggil metode setiap kelas secara terpisah, kami dapat dengan mudah menyimpan semua objek dalam satu koleksi, dll.

Tapi inilah pertanyaan yang menarik: draw()metode apa yang harus dideklarasikan langsung di ChessItemkelas menggambar di layar? Lagi pula, tidak ada bidak seperti itu dalam catur, jadi tidak ada yang bisa digambar.

Itu benar sekali. Terlebih lagi, tidak masuk akal untuk membuat ChessItemobjek secara langsung. Ini bukan bidak catur, melainkan hanya abstraksi — kelas yang kami buat untuk kenyamanan kami. Beginilah cara abstraksi bekerja di OOP : kami memindahkan data dan metode penting (yang dibagikan oleh semua bagian) ke kelas dasar, dan menyimpan perbedaannya di kelas keturunan yang terpisah.


2. Kelas abstrak

Kelas abstrak

Untuk situasi seperti itu, Java memiliki jenis kelas khusus: kelas abstrak . Mereka dirancang untuk memudahkan pemrogram bekerja dengan kelas serupa dan mengurangi jumlah kode duplikat di dalamnya.

Berikut adalah tiga hal yang perlu diketahui tentang kelas abstrak.

Metode tanpa implementasi

Kelas abstrak dapat memiliki deklarasi metode tanpa implementasi. Inilah yang membuat metode ini abstrak. Badan metode hanya diganti dengan titik koma. Dan sebelum nama metodenya, kita tulis kata abstractkuncinya. Contoh:

public abstract class ChessItem
{
   public int x, y; // Coordinates
   private int value; // The piece's value
   public int getValue() // Ordinary method that returns value field
   {
      return value;
   }

   public abstract void draw(); // Abstract method. The implementation is missing.
}

Kelas abstrak

Setiap metode tanpa implementasi ditandai dengan kata kunci abstrak. Jika suatu kelas bahkan memiliki satu metode abstrak, kelas tersebut juga ditandai dengan kata abstractkunci.

Melarang penciptaan objek

Anda tidak dapat membuat objek dari kelas abstrak . Kode seperti itu tidak akan dikompilasi.

Kode Keterangan
ChessItem item = new ChessItem();
item.draw();
Kode ini tidak dapat dikompilasi :
ChessItem item = new Queen();
item.draw();
Tapi Anda bisa melakukan ini

Mewarisi kelas abstrak

Jika kelas Anda mewarisi kelas abstrak, maka Anda perlu mengganti semua metode abstrak yang diwariskan, yaitu Anda perlu menulis implementasinya. Jika tidak, kelas Anda sendiri juga harus dinyatakan abstrak.

Jika suatu kelas bahkan memiliki satu metode yang tidak diimplementasikan yang dideklarasikan langsung di dalamnya atau diwarisi dari kelas induk, maka kelas tersebut dianggap abstrak.

Dan mengapa semua ini perlu? Mengapa kelas abstrak dibutuhkan? Apakah tidak mungkin menggunakan yang biasa saja? Dan alih-alih metode abstrak, tidak bisakah kita menulis dua kurung kurawal kosong sebagai badan metode?

Kita bisa. Tetapi batasan ini mirip dengan privatepengubah. Kami menggunakan kata kunci privat untuk secara sengaja mencegah pemrogram lain mengakses data secara langsung dan memaksa mereka untuk hanya menggunakan metode publik kami saat menulis kelas mereka.

Itu sama dengan kelas abstrak. Penulis kelas abstrak tidak ingin objek kelas dibuat. Sebagai gantinya, penulis mengharapkan metode abstrak diwariskan dari kelas abstrak dan kemudian diganti.

Keuntungan dari pendekatan ini mudah terlihat dalam proyek-proyek besar. Semakin banyak kelas yang Anda miliki, semakin jelas Anda perlu menggambarkan peran mereka. Anda akan melihat manfaat dari pendekatan ini dalam waktu dekat. Setiap hal melewati ini.