1. Ümumi baz sinif
Bu gün sadəcə maraqlı mövzular günü. Vəziyyəti yadınıza salın, biz bütün şahmat fiqurları üçün ChessItem
adlı baz sinif daxil etmişdik? Ümidvaram ki, yadınızdadır 🙂
İndi təsəvvür edin ki, hər bir fiqurun ekranda çəkilməsi üçün bir metodu var, məsələn, draw()
. Bu metodu çağırırsan draw()
və fiqur öz cari koordinatlarında özü çəkilir. Bu metodu baz sinifə çıxarmaq çox rahat olardı.
Əgər draw()
metodu ChessItem
baz sinfində olsaydı, onu digər fiqurların siniflərində override edərək belə elegant kod yaza bilərdik:
class ChessBoard
{
public void drawAllChessItems()
{
// fiqurlar siyahıya əlavə olunur
ArrayList<ChessItem> items = new ArrayList<ChessItem>();
items.add(new King());
items.add(new Queen());
items.add(new Bishop());
// onları tipdən asılı olmayaraq çəkirik
for(ChessItem item: items)
{ item.draw();
}
}
}
Baz sinif ChessItem
daxil etmək kodu çox sadələşdirir: hər bir sinfin metodlarını ayrıca çağırmağa ehtiyac yoxdur, bütün obyektləri asanlıqla bir kolleksiyada saxlamaq olar və s.
Amma maraqlı sual yaranır: ChessItem
sinfinin özündə elan edilmiş draw()
metodu ekranda nəyi çəkəcək? Axı belə bir fiqur şahmatda yoxdur, deməli çəkməyə də bir şey yoxdur.
Məhz. Üstəlik, ChessItem
tipində obyektlər yaratmaq mənasızdır. Bu şahmat fiquru deyil, sadəcə bir abstraksiyadır — biz bunun sinfini rahatlıq üçün yaratmışıq. OOP-dən gələn abstraksiya belə işləyir: önəmli (bütün fiqurlar üçün ümumi) məlumatları və metodları baz sinifə çıxardırıq, onların fərqliliklərini isə öz siniflərində saxlayırıq.
2. Abstrakt siniflər

Belə bir vəziyyət üçün Java-da xüsusi bir sinif tipi var — abstrakt siniflər. Onlar proqramçılar üçün oxşar siniflərlə işə sadəlik gətirilməsi və onlardakı oxşar kodu azaltmaq üçün yaradılıb.
Abstrakt siniflər haqqında bilməli olduğunuz üç şey:
Realizasiyası olmayan metodlar
Abstrakt sinif metod bəyannaməsini realizasiyasız saxlaya bilər. Belə metodlara abstrakt metod deyilir. Metodun bədəni yerinə sadəcə nöqtəli vergül yazılır. Və metodun adına öncə abstract
açar sözü əlavə edilir. Nümunə:
public abstract class ChessItem
{
public int x, y; // koordinatlar
private int value; // fiqurun "qiyməti"
public int getValue() // adi metod, value dəyərini qaytarır
{
return value;
}
public abstract void draw(); // abstrakt metod. Realizasiya yoxdur.
}
Abstrakt sinif
Realizasiyası olmayan hər bir metod xüsusi abstract açar sözü ilə qeyd olunur. Əgər sinifdə ən az bir abstrakt metod varsa, sinif də abstract
açar sözü ilə qeyd edilir.
Obyektlərin yaradılmasına qadağa
Abstrakt sinifdən obyektlər yaratmaq olmaz. Belə bir kod sadəcə kompilyasiya olunmayacaq.
Kod | Təsvir |
---|---|
|
Bu kod kompilyasiya olunmayacaq |
|
Belə isə mümkündür |
Abstrakt sinifdən miras almaq
Əgər sinifinizi abstrakt sinifdən miras almışsınızsa, bütün miras alınmış abstrakt metodları yenidən yazmalı və onlar üçün realizasiya təqdim etməlisiniz. Əks halda, həmin sinifi də abstrakt elan etmək lazım olacaq.
Əgər sinifdə ən az bir dəqiqləşdirilməmiş metod varsa, ya onun özündə, ya da valideyn sinifdən miras aldığı metodlardan, həmin sinif abstrakt hesab olunur.
Bütün bu nəyə lazımdır? Abstrakt siniflər nə işə yarayır? Axı, onların əvəzinə adi siniflər istifadə etmək olmazmı? Abstrakt metodların yerinə isə sadəcə bədən olaraq iki mötərizə yazmaq – {}?
Olar. Amma bu məhdudiyyətlər private
modifikatoruna bənzəyir. Biz private
ilə məlumatlara birbaşa çıxışı qadağan edirdik ki, digər proqramçılar və siniflər sadəcə bizim yazdığımız public
-metodlardan istifadə edə bilsin.
Eyni şey abstrakt siniflə də bağlıdır. Bu sinifi yazan şəxs istəyir ki, onun obyektləri yaradılmasın. Əksinə, o, ümid edir ki, onun abstrakt sinifindən irs almaq və abstrakt metodları yenidən yazaraq istifadə etmək olar.
Bu yanaşmanın üstünlüyü böyük layihələrdə daha aydın görünür. Nə qədər çox sinif varsa, onların rollarını o qədər dəqiq müəyyən etmək lazım olur. Bu yanaşmanın üstünlüklərini görəcəksiniz və çox yaxın gələcəkdə. Hamı bu mərhələdən keçir.
GO TO FULL VERSION