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).

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

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

7/9