1. Közös alaposztály
Ma egy sor érdekes témát fogunk élvezni. Emlékszel, amikor bevezettük az ChessItem
alaposztályt, hogy leegyszerűsítsük az összes sakkfigurát ábrázoló osztályt? Remélem 🙂
Most képzeljük el, hogy minden darabnak van egy draw()
módszere, amely kezeli a képernyőre való rajzolását. Meghívod a draw()
metódust, és a darab megrajzolja magát az aktuális koordinátáira. Kényelmes lenne ezt a metódust áthelyezni az alaposztályba.
Ha a draw()
metódus a ChessItem alaposztályban volt, akkor a darab osztályokban felülírhatnánk és elegáns kódot írhatnánk így:
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();
}
}
}
Az alaposztály bevezetésével ChessItem
nagyban le tudtuk egyszerűsíteni a kódot: nem kell külön meghívni az egyes osztályok metódusait, könnyedén tárolhatjuk az összes objektumot egyetlen gyűjteményben stb.
De itt egy érdekes kérdés: mit rajzoljon a képernyőre az osztályban draw()
közvetlenül deklarált metódus ? ChessItem
Hiszen a sakkban nincs ilyen bábu, így nincs mit húzni.
Pontosan így van. Ráadásul nincs értelme ChessItem
közvetlenül objektumokat létrehozni. Ez nem egy sakkfigura, inkább csak egy absztrakció – egy osztály, amelyet a mi kényelmünk érdekében hoztunk létre. Így működik az absztrakció az OOP- ban : a fontos adatokat és metódusokat (amiket minden darab megoszt) áthelyezünk egy alaposztályba, és ezek különbségeit külön leszármazott osztályokban tároljuk.
2. Absztrakt osztályok
Ilyen helyzetekre a Java-nak van egy speciális osztálya: az absztrakt osztály . Úgy tervezték őket, hogy megkönnyítsék a programozók számára a hasonló osztályokkal való munkát, és csökkentsék azokban a duplikált kódok mennyiségét.
Íme három dolog, amit tudnia kell az absztrakt osztályokról.
Megvalósítás nélküli módszer
Egy absztrakt osztálynak lehet metódus deklarációja megvalósítás nélkül. Pontosan ez teszi a módszert elvonttá. A metódus törzsét egyszerűen pontosvesszővel helyettesítjük. A metódus neve elé pedig a abstract
kulcsszót írjuk. Példa:
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.
}
Absztrakt osztály
Minden implementáció nélküli metódus az absztrakt kulcsszóval van megjelölve. Ha egy osztálynak csak egy absztrakt metódusa van, akkor az osztályt is megjelöljük a kulcsszóval abstract
.
Tárgyak létrehozásának tilalma
Nem hozhat létre objektumokat egy absztrakt osztályból . Az ilyen kód egyszerűen nem fordítható le.
Kód | Leírás |
---|---|
|
Ez a kód nem fordítja le : |
|
De ezt megteheti |
Absztrakt osztály öröklése
Ha az osztályod egy absztrakt osztályt örököl, akkor az összes örökölt absztrakt metódust felül kell bírálnod, azaz implementációt kell írnod hozzájuk. Ellenkező esetben magát az osztályt is absztraktnak kell nyilvánítani.
Ha egy osztályban csak egy implementálatlan metódus van deklarálva közvetlenül, vagy egy szülőosztálytól örökölt, akkor az osztály absztraktnak számít.
És miért van szükség mindezekre? Miért van szükség absztrakt osztályokra? Nem lehet helyette rendeseket használni? És az absztrakt metódusok helyett nem írhatnánk két üres zárójelet metódustörzsként?
Tudnánk. De ezek a korlátozások hasonlóak a private
módosítóhoz. A privát kulcsszót arra használjuk, hogy szándékosan megakadályozzuk, hogy más programozók közvetlenül hozzáférjenek az adatokhoz, és arra kényszerítjük őket, hogy csak a mi nyilvános módszereinket használják osztályaik írásakor.
Ugyanez a helyzet az absztrakt osztályokkal. Egy absztrakt osztály szerzője nem akarja, hogy az osztály objektumai jöjjenek létre. Ehelyett a szerző azt várja, hogy az absztrakt metódusokat az absztrakt osztályból örököljék, majd felülírják.
Ennek a megközelítésnek az előnye a nagy projekteknél nyilvánvaló. Minél több osztályod van, annál világosabban kell körülhatárolnod a szerepüket. A közeljövőben látni fogja ennek a megközelítésnek az előnyeit. Minden ezen megy keresztül.
GO TO FULL VERSION