Dědičnost
Boss je příšera s něčím navíc: bojuje ve fázích. Mohli byste celou třídu Prisera zkopírovat a přidat vlastnost, jenže pak byste každou změnu příšer museli dělat dvakrát. Místo toho může jedna třída rozšířit jinou:
class Prisera {
jmeno: string;
zivoty: number;
constructor(jmeno: string, zivoty: number) {
this.jmeno = jmeno;
this.zivoty = zivoty;
}
popis(): string {
return `${this.jmeno} (${this.zivoty} životů)`;
}
}
class Boss extends Prisera {
faze: number;
constructor(jmeno: string, zivoty: number, faze: number) {
super(jmeno, zivoty);
this.faze = faze;
}
}
const drak = new Boss("Drak", 300, 1);
console.log(drak.popis());
console.log(drak);Vypíše:
Drak (300 životů)
Boss { jmeno: "Drak", zivoty: 300, faze: 1 }class Boss extends Prisera znamená: Boss má všechno, co má Prisera, tedy vlastnosti jmeno a zivoty i metodu popis, a k tomu, co přidá sám, tady vlastnost faze. Tomu se říká dědičnost: Boss dědí od třídy Prisera. Prisera je rodičovská třída, Boss odvozená třída (potomek). Je to podobné jako interface Boss extends Prisera z lekce 4, jenže třída nedědí jen tvar, ale i kód: drak.popis() funguje, přestože ve třídě Boss žádná metoda popis není.
Konstruktor rodiče: super. Vlastnosti rodiče nastavuje konstruktor rodiče, a proto ho konstruktor odvozené třídy musí zavolat jako první. super(jmeno, zivoty) spustí konstruktor třídy Prisera s těmito argumenty. Teprve pak je objekt připravený a konstruktor může pokračovat vlastními vlastnostmi. Bez super TypeScript ohlásí:
class Prisera {
jmeno: string;
zivoty: number;
constructor(jmeno: string, zivoty: number) {
this.jmeno = jmeno;
this.zivoty = zivoty;
}
}
class Boss extends Prisera {
faze: number = 1;
constructor(jmeno: string, zivoty: number) {
console.log("Objevil se boss!");
}
}TypeScript ohlásí:
main.ts(14,5): error TS2377: Constructors for derived classes must contain a 'super' call.Když použijete this před super(…), dostanete chybu 'super' must be called before accessing 'this' in the constructor of a derived class. (TS17009). A super kontroluje argumenty jako každé volání: když jeden chybí, ohlásí TS2554. Odvozená třída, která vlastní konstruktor nepotřebuje, ho může vynechat a použije konstruktor rodiče: kdyby Boss měl jen faze: number = 1;, psali byste new Boss("Drak", 300).
Boss je příšera. Všude, kde se čeká Prisera, se hodí i Boss: do pole Prisera[] nebo jako argument funkce function zautoc(prisera: Prisera). Přes typ Prisera ale smíte používat jen to, co má každá příšera. S const prisery: Prisera[] = [skret, drak]; skončí prisery[1].faze chybou Property 'faze' does not exist on type 'Prisera'. (TS2339).
Jak psát:
Pokyny
Napište třídu Drak, která rozšiřuje třídu Prisera a přidává vlastnost silaOhne (číslo). Její konstruktor má tři parametry, jmeno, zivoty a silaOhne: první dva předá do super a silaOhne nastaví sám.
Nad polem prisery vytvořte const drak = new Drak("Rudý drak", 300, 40); a přidejte drak do pole. Program vypíše:
Skřet (30 životů)
Vlk (25 životů)
Rudý drak (300 životů)Přidejte do třídy Drak metodu chrliOhen(): string. Ta vrátí jméno draka a sílu ohně takto: Rudý drak chrlí oheň: 40 poškození. Na konci programu vypište drak.chrliOhen(). (Volejte ji na drak, ne na prisery[2]: přes typ Prisera TypeScript neví, že jde o draka.) Program vypíše:
Skřet (30 životů)
Vlk (25 životů)
Rudý drak (300 životů)
Rudý drak chrlí oheň: 40 poškozeníZačněte programovat zdarma
7/9