1. Kelas asas biasa

Hari ini kita akan menikmati pelbagai topik menarik. Ingat apabila kami memperkenalkan ChessItemkelas asas untuk memudahkan semua kelas yang mewakili buah catur? Saya harap begitu 🙂

Sekarang bayangkan bahawa setiap bahagian mempunyai draw()kaedah yang mengendalikan lukisan pada skrin. Anda memanggil draw()kaedah itu, dan bahagian itu melukis dirinya pada koordinat semasanya. Adalah lebih mudah untuk memindahkan kaedah ini ke kelas asas.

Jika draw()kaedah itu berada dalam kelas asas ChessItem, maka kita boleh mengatasinya dalam kelas sekeping dan menulis kod 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 asas, kami dapat memudahkan kod: tidak perlu memanggil kaedah setiap kelas secara berasingan, kami boleh menyimpan semua objek dengan mudah dalam satu koleksi, dsb.

Tetapi inilah soalan yang menarik: apakah draw()kaedah yang diisytiharkan secara langsung dalam ChessItemkelas perlu dilukis pada skrin? Lagipun, tidak ada sekeping seperti itu dalam catur, jadi tidak ada apa-apa untuk dilukis.

Betul sekali. Lebih-lebih lagi, tidak masuk akal untuk mencipta ChessItemobjek secara langsung. Ia bukan sekeping catur, sebaliknya hanya abstraksi — kelas yang kami cipta untuk kemudahan kami. Beginilah cara abstraksi berfungsi dalam OOP : kami memindahkan data dan kaedah penting (yang dikongsi oleh semua bahagian) ke kelas asas, dan mengekalkan perbezaannya dalam kelas keturunan yang berasingan.


2. Kelas abstrak

Kelas abstrak

Untuk situasi sedemikian, Java mempunyai jenis kelas khas: kelas abstrak . Mereka direka bentuk untuk memudahkan pengaturcara bekerja dengan kelas yang serupa dan mengurangkan jumlah kod pendua di dalamnya.

Berikut ialah tiga perkara yang perlu diketahui tentang kelas abstrak.

Kaedah tanpa pelaksanaan

Kelas abstrak boleh mempunyai pengisytiharan kaedah tanpa pelaksanaan. Inilah yang menjadikan kaedah itu abstrak. Badan kaedah hanya digantikan dengan koma bertitik. Dan sebelum nama kaedah, kami menulis abstractkata kunci. 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 kaedah tanpa pelaksanaan ditandakan dengan kata kunci abstrak. Jika kelas mempunyai walaupun satu kaedah abstrak, kelas itu juga ditandakan dengan abstractkata kunci.

Melarang penciptaan objek

Anda tidak boleh mencipta objek kelas abstrak . Kod sedemikian tidak akan disusun.

Kod Penerangan
ChessItem item = new ChessItem();
item.draw();
Kod ini tidak menyusun :
ChessItem item = new Queen();
item.draw();
Tetapi anda boleh melakukan ini

Mewarisi kelas abstrak

Jika kelas anda mewarisi kelas abstrak, maka anda perlu mengatasi semua kaedah abstrak yang diwarisi, iaitu anda perlu menulis pelaksanaan untuk mereka. Jika tidak, kelas anda sendiri juga perlu diisytiharkan sebagai abstrak.

Jika kelas mempunyai walaupun satu kaedah yang tidak dilaksanakan yang diisytiharkan secara langsung di dalamnya atau diwarisi daripada kelas induk, maka kelas itu dianggap abstrak.

Dan mengapa semua ini perlu? Mengapakah kelas abstrak diperlukan? Bukankah boleh menggunakan yang biasa sahaja? Dan bukannya kaedah abstrak, bolehkah kita menulis dua kurungan kerinting kosong sebagai badan kaedah?

Kita boleh. Tetapi sekatan ini serupa dengan privatepengubah suai. Kami menggunakan kata kunci peribadi untuk sengaja menghalang pengaturcara lain daripada mengakses data secara langsung dan memaksa mereka menggunakan kaedah awam kami sahaja semasa menulis kelas mereka.

Ia sama dengan kelas abstrak. Pengarang kelas abstrak tidak mahu objek kelas dibuat. Sebaliknya, penulis menjangkakan kaedah abstrak diwarisi daripada kelas abstrak dan kemudian ditindih.

Kelebihan pendekatan ini mudah dilihat dalam projek besar. Lebih banyak kelas yang anda ada, lebih jelas anda perlu menggambarkan peranan mereka. Anda akan melihat manfaat pendekatan ini dalam masa terdekat. Setiap perkara melalui ini.