Öröklődés deklarálása
Az öröklődés alapelv azt mondja ki, hogy ha készen vagyunk egy osztállyal (megadtuk annak adatait és műveleteit), akkor képesek legyünk egy új osztályt létrehozni oly módon, hogy ezen, már kész osztályból kiindulva.
Az öröklődés során az új osztály (gyermekosztály) deklarálásakor meg kell adni az ős osztály nevét is. Egy gyermekosztálynak csak egy őse lehet. Az ős osztály nevét kettőspont mögött kell felírni.
Pl.:
class TJavitottTelefon : TTelefon
{
...
}
Pl.:
class TLopakodoRepulo: TVadaszRepulo
{
...
}
Az öröklődés alapelv azt mondja ki, hogy ha készen vagyunk egy osztállyal (megadtuk annak adatait és műveleteit), akkor képesek legyünk egy új osztályt létrehozni oly módon, hogy ezen már kész osztályból kiinduljon.
Az öröklődés során hasonló eredményt érünk el, mintha az ős osztály kódját egyszerűen blokkmásolással leduplikáltuk volna, és átneveztük volna az új osztály nevére, majd e ponttól kezdve folytattuk volna a fejlesztést.
Ugyanakkor, ezen technika fejlettebb, hiszen amennyiben az ős osztályban bárminemű módosítást végrehajtanánk utólag, a blokkmásolást meg kellene ismételni. Az öröklődés során azonban a frissítés automatikus.
A gyerekosztály kiinduláskor tartalmazza az ős osztály minden mezőjét és metódusát, csak a továbbfejlesztésekkel kapcsolatos módosításokra kell koncentrálni.
Ha nem jelölünk őst
Amennyiben az új osztály létrehozásakor nem jelölünk meg őst, úgy a fordító úgy tekinti, hogy az Object nevű objektumosztályt tekintjük ősnek:
class THattertarolo
{
...
}
… felírás ugyanaz, mintha …
class THattertarolo:Object
{
...
}
… írtunk volna.
Öröklődés után új mezők hozzáadása
A gyermekosztályban lehetőség van új mezők hozzáadásával kiegészíteni az osztályt. Ez nyilvánvalóan szükséges, hiszen a továbbfejlesztett osztály több adatot lehet képes kezelni.
Pl.:
class TKor
{
public int x;
public int y;
public int sugar;
}
class TAbrazolhatoKor : TKor
{
public int vonalSzine;
public int vonalVastagsag;
}
A klasszikus (matematikai) kör leírásához annak koordinátái és sugara elégséges. Ha azonban ezt a kört ki is szeretnénk rajzolni a képernyőre, úgy a vonal színe és vastagsága is érdekes.
Öröklődés után új metódusok hozzáadása
A gyermekosztályban lehetőség van új metódusok hozzáadásával kiegészíteni az osztályt. Ez nyilvánvalóan szükséges, hiszen a továbbfejlesztett osztály több művelet elvégzésére is képes lehet.
Pl.:
class TKor
{
public int x;
public int y;
public int sugar;
public double Terulet() { return sugar * sugar * Math.PI; }
public double Kerulet() { return 2 * sugar * Math.PI; }
}
class TAbrazolhatoKor : TKor
{
public int vonalSzine;
public int vonalVastagsag;
public void Kirajzolas() { … }
public void Letorles() { … }
}
A klasszikus (matematikai) kör műveletei közé tartoznak a kerület és terület lekérdezése. A képernyőn megjelenő kör képes saját magát kirajzolni vagy letörölni.
Öröklődés és a túlterhelés
Amennyiben az ős osztályban már kidolgozásra kerül valamely metódus, azt a gyermekosztály az öröklődés kapcsán átveszi. A gyermekosztályban lehetőség van új metódusok bevezetésére. Ezen új metódusok jellemzően más-más névvel rendelkeznek, de lehetőség van ugyanolyan nevű metódus készítésére is.
Amennyiben a gyermekosztályban készített ugyanolyan nevű metódus paraméterezése eltér az őstől örököl metódustól, úgy az overloading miatt mindkettő használható marad. Az aktuális paraméterlista alapján a fordító képes meghatározni, melyik metódust kívánjuk meghívni.
Pl.:
class TAuto
{
public double Feltankol() // legyen a tank teljesen tele
{
...
}
}
class TAuto2 : TAuto
{
public double Feltankol(double liter) // ennyi ’liter’ benzin betöltése
{
...
}
}
Öröklődés és metóduselfedés
Amennyiben az ős osztályban már kidolgozásra kerül valamely metódus, azt a gyermekosztály az öröklődés kapcsán átveszi. A gyermekosztályban lehetőség van új metódusok bevezetésére. Ezen új metódusok jellemzően más-más névvel rendelkeznek, de lehetőség van ugyanolyan nevű metódus készítésére is.
Amennyiben a gyermekosztályban készített ugyanolyan nevű metódus paraméterezése is ugyanaz, úgy az overloading nem kihasználható. E pillanattól kezdve a gyermekosztályból készített példányok esetén az új változat kerül meghívásra (elfedi a régi verziót).
Pl.:
class TVektor
{
public void Rendezes() // egyfajta rendezőmódszer
{
...
}
}
class TVektor2 : TVektor
{
public void Rendezes() // hatékonyabb rendezés
{
...
}
}
Meghívása:
TVektor v = new TVektor();
v.Rendezes(); // ez az kevésbé hatékony rendezés használata
TVektor2 m = new TVektor2();
m.Rendezes(); // a hatékonyabb használata
Egy osztály továbbfejlesztését meggátolhatjuk, ha a sealed (lepecsételt) kulcsszóval ellátjuk.
Ezzel gyakorlatilag azt akadályozhatjuk meg, hogy ezen osztályt ősnek választhassuk. Nyilván erre csak rendkívül ritkán, erősen indokolt esetben kerülhet sor.
sealed class TBefejezettOsztaly: TAkarmilyenOs
{
…
…
}