private a public

Každý kód může změnit kteroukoli vlastnost objektu. Stačí jeden neopatrný řádek kdekoli ve hře a Kira má záporné zlato:

class Hrdina {
    jmeno: string;
    zlato: number = 0;

    constructor(jmeno: string) {
        this.jmeno = jmeno;
    }

    vydelej(castka: number): void {
        this.zlato = this.zlato + castka;
    }
}

const kira = new Hrdina("Kira");
kira.vydelej(50);
kira.zlato = kira.zlato - 80; // koupí meč za 80 zlatých
console.log(`${kira.jmeno} má ${kira.zlato} zlatých`);

Vypíše:

Kira má -30 zlatých

Třída by si své zlato měla hlídat sama: měnit ho smějí jen její vlastní metody, a ty můžou kontrolovat pravidla. Označte vlastnost jako private:

class Hrdina {
    jmeno: string;
    private zlato: number = 0;

    constructor(jmeno: string) {
        this.jmeno = jmeno;
    }

    vydelej(castka: number): void {
        this.zlato = this.zlato + castka;
    }

    utrat(castka: number): boolean {
        if (castka > this.zlato) {
            return false;
        }
        this.zlato = this.zlato - castka;
        return true;
    }

    zjistiZlato(): number {
        return this.zlato;
    }
}

const kira = new Hrdina("Kira");
kira.vydelej(50);
console.log(kira.utrat(80));
console.log(kira.utrat(30));
console.log(`${kira.jmeno} má ${kira.zjistiZlato()} zlatých`);

Vypíše:

false
true
Kira má 20 zlatých

Soukromou vlastnost (private) můžete používat jen uvnitř třídy, v jejích metodách, přes this. Kód mimo třídu ji nesmí číst ani měnit. Přidejte na konec programu kira.zlato = 1000; a TypeScript ohlásí:

main.ts(31,6): error TS2341: Property 'zlato' is private and only accessible within class 'Hrdina'.

Zbytek hry se ke zlatu dostane přes metody a ty dodržují pravidla: utrat vrátí false a nic nezmění, když zlato nestačí, a zjistiZlato dovolí zlato přečíst, ale ne změnit. Vlastnosti a metody bez private jsou veřejné (public): smí je použít kdokoli. To platí automaticky. Můžete to napsat i výslovně (public jmeno: string;), většina kódu to ale nedělá.

Stejně jako readonly v lekci 4 kontroluje private jen TypeScript. V JavaScriptu je zlato obyčejná vlastnost a console.log(kira) ji pořád ukáže: Hrdina { jmeno: "Kira", zlato: 20 }. JavaScript má i vlastní soukromé vlastnosti, jejichž názvy začínají znakem # (#zlato); ty zůstanou skryté i za běhu programu. V cizím kódu potkáte oba druhy.

Typické chyby: čtení soukromé vlastnosti mimo třídu (přidejte metodu, která ji vrátí, jako zjistiZlato) a soukromá metoda, kterou zbytek programu potřebuje volat.

Pokyny

Spusťte program: Lena skončí se zápornou manou. Přidejte metodu sesli(cena: number): boolean: když má mág méně many, než je cena, vrátí false a nic nezmění; jinak od mana odečte cena a vrátí true. Oba řádky, které mění lena.mana, nahraďte příkazem console.log(lena.sesli(15));. Program vypíše:

true
false
Lena má 5 many

Aby nikdo nemohl sesli obejít, označte vlastnost mana jako private. TypeScript pak ohlásí poslední řádek, který čte lena.mana zvenku. Přidejte metodu zjistiManu(): number a na tom řádku ji použijte. Program vypíše totéž co předtím.

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

4/9