CodeGym /Java blog /Véletlen /Az osztályok közötti kapcsolatok. Öröklődés, összetétel é...
John Squirrels
Szint
San Francisco

Az osztályok közötti kapcsolatok. Öröklődés, összetétel és összesítés

Megjelent a csoportban
Szia! Ma közelebbről megvizsgáljuk az objektum-orientált programozás (OOP) egyik alapelvét: az öröklődést. Tanulmányozzuk az osztályok közötti kapcsolatok egyéb típusait is: az összetételt és az aggregációt. Az osztályok közötti kapcsolatok.  Öröklődés, összetétel és összesítés – 1Ez a téma nem lesz nehéz: már sokszor találkozott öröklődéssel és öröklődési példákkal az elmúlt órákon. Ma az lesz a legfontosabb, hogy megerősítse tudását, részletesebben megvizsgálja az öröklődés mechanizmusát, és még egyszer végigfusson néhány példán. :) Na, gyerünk!

A Java öröklődése és előnyei

Mint bizonyára emlékszel, az öröklődés egy olyan mechanizmus, amely lehetővé teszi egy új osztály leírását egy meglévő osztály (szülőosztály) alapján. Ennek során az új osztály kölcsönveszi a szülőosztály tulajdonságait és funkcióit. Idézzünk fel egy példát az öröklődésre az előző leckékben:

public class Car {

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }


public void gas() {
       // Gas
   }

   	public void brake() {
       // Brake
   }
}


public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}



public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
Van egy bizonyos programunk, amely magában foglalja a különféle típusú autókkal való munkát. Még ha nem is vagy autórajongó, valószínűleg tudod, hogy nagyon sokféle autó létezik a világon. :) Ennek megfelelően szétválasztjuk az autók közös tulajdonságait egy közös szülőosztályba, melynek neve Car. Tehát mi a közös minden autóban, típustól függetlenül? Minden autónak megvan a gyártási éve, a modell neve és a maximális sebesség. modelEzeket a tulajdonságokat a , maxSpeed, és mezőkbe helyezzük yearOfManufacture. Ami a viselkedést illeti, minden autó gyorsíthat és lassíthat. :) Ezt a viselkedést az gas()ésbrake()mód. Milyen előnyökkel jár ez számunkra? Először is csökkenti a kód mennyiségét. Természetesen a szülői osztályt nélkülözhetjük. gas()De mivel minden autónak képesnek kell lennie gyorsulni és lassítani, metódusokat kell létrehoznunk brake()a Truck, Sedan, F1Car, és SportsCarosztályokban és minden más autóosztályban. Képzeld el, mennyi extra kódot kellene írnunk. És ne feledkezzünk meg a model, maxSpeed, és yearOfManufacturemezőkről sem: ha megszabadulunk a szülőosztálytól, minden autóosztályban meg kell alkotnunk! Az osztályok közötti kapcsolatok.  Öröklődés, összetétel és összesítés – 2Ha van pár tucat autóosztályunk, akkor a duplikált kódok száma nagyon komoly lesz. Ha a közös mezőket és metódusokat (más néven "állapotokat" és "viselkedéseket") áthelyezzük egy szülőosztályba, sok időt és helyet takaríthatunk meg. Ha egy típus olyan egyedi tulajdonságokkal vagy módszerekkel rendelkezik, amelyekkel más autótípusok nem rendelkeznek, az nem nagy baj. Mindig létrehozhatja őket egy leszármazott osztályban, mindenkitől elkülönítve.

public class F1Car extends Car {

   public void pitStop() {

       // Only race cars make pit stops
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
Példaként nézzük a Forma-1 versenyautóit. A "rokonaikkal" ellentétben ők egyedi viselkedést mutatnak – időnként megállnak. Ez minket nem zavar. Már leírtuk a Carszülő osztály általános viselkedését, és a leszármazott osztályok sajátos viselkedése hozzáadható ezekhez az osztályokhoz. Az osztályok közötti kapcsolatok.  Öröklődés, összetétel és összesítés – 3Ugyanez igaz a mezőkre is: ha egy gyermekosztály egyedi tulajdonságokkal rendelkezik, nyugodtan deklaráljuk ezeket a mezőket a gyermekosztályon belül, és ne aggódjunk. :) A kód újrafelhasználásának lehetősége az öröklődés fő előnye. A programozók számára nagyon fontos, hogy ne írjanak extra kódot. Ezzel többször is találkozni fog a munkája során. Ne felejtsen el még valamit, ami nagyon fontos: a Java nem öröklődik többszörösen. Minden osztály csak egy osztályt örököl. Ennek okairól a következő leckéken fogunk még beszélni. Egyelőre csak emlékezzen rá. Mellesleg ettől különbözik a Java néhány más OOP nyelvtől. Például a C++ támogatja a többszörös öröklődést. Az örökléssel többé-kevésbé minden világos. Menjünk tovább.

Összetétel és összesítés

Az osztályok és az objektumok összekapcsolhatók. Az öröklődés egy "is-a" kapcsolatot ír le. Az oroszlán egy állat. Egy ilyen kapcsolat könnyen kifejezhető örökléssel, ahol Animala szülő osztály és Liona gyermek. Azonban nem minden kapcsolatot írnak le így. Például egy billentyűzet határozottan kapcsolódik egy számítógéphez, de nem számítógép . A kezek valahogyan rokonok egy személyhez, de nem személy. Ezekben az esetekben más típusú kapcsolatunk van: nem „is-a”, hanem „van-a”. A kéz nem személy, hanem egy személy része. A billentyűzet nem számítógép, hanem a számítógép része. A has-a kapcsolat kódban írható le összetétel és aggregáció segítségével. A különbség a kapcsolat "szigorában" rejlik. Mondjunk egy egyszerű példát: Van egy Carosztályunk. Minden autónak van motorja. Ráadásul minden autóban vannak utasok. Mi az alapvető különbség a Engine engineés Passenger[] passengersmezők között? Az a tény, hogy az utas Aaz autóban ül, nem jelenti azt, hogy az utasok Bnincsenek Caz autóban. Egy autó több utasnak is megfelelhet. Sőt, ha az összes utas kiszáll egy autóból, akkor is zökkenőmentesen fog működni. CarAz osztály és a tömb közötti kapcsolat Passenger[] passengerskevésbé szigorú. Aggregációnak hívják . Ez egy másik jó példa az aggregációra. Tegyük fel, hogy van egy Studentosztályunk és aStudentGrouposztály. Egy diák több diákszervezethez is csatlakozhat: fizika klubhoz, Star Wars rajongói klubhoz és/vagy diákkomikus klubhoz. A kompozíció szigorúbb kapcsolat. Kompozíció használatakor egy objektum egy objektum része, és nem tartozhat egy másik, azonos típusú objektumhoz. A legegyszerűbb példa egy autómotor. A motor egy autó része, és nem lehet egy másik autó része. Amint láthatja, kapcsolatuk sokkal szigorúbb, mint a Carés között fennálló kapcsolat Passengers. Az osztályok közötti kapcsolatok.  Öröklődés, összetétel és összesítés – 4
Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION