1. Közös alaposztály

Ma egy sor érdekes témát fogunk élvezni. Emlékszel, amikor bevezettük az ChessItemalaposztá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 ChessItemnagyban 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 ? ChessItemHiszen a sakkban nincs ilyen bábu, így nincs mit húzni.

Pontosan így van. Ráadásul nincs értelme ChessItemkö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

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 abstractkulcsszó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
ChessItem item = new ChessItem();
item.draw();
Ez a kód nem fordítja le :
ChessItem item = new Queen();
item.draw();
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 privatemó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.