1. Kelas asas biasa
Hari ini kita akan menikmati pelbagai topik menarik. Ingat apabila kami memperkenalkan ChessItem
kelas 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 ChessItem
kelas 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 ChessItem
kelas 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 ChessItem
objek 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
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 abstract
kata 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 abstract
kata kunci.
Melarang penciptaan objek
Anda tidak boleh mencipta objek kelas abstrak . Kod sedemikian tidak akan disusun.
Kod | Penerangan |
---|---|
|
Kod ini tidak menyusun : |
|
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 private
pengubah 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.
GO TO FULL VERSION