Ce face override
Când o clasă derivată rescrie o metodă a părintelui, poți pune override în față. Cuvântul cere compilatorului să verifice că părintele chiar are o metodă cu acel nume. Dacă greșești numele sau dacă metoda din părinte este redenumită sau ștearsă mai târziu, primești eroare, în loc ca metoda ta să devină în tăcere o metodă nouă, niciodată apelată.
Opțiunea de compilare noImplicitOverride face cuvântul obligatoriu: orice metodă care rescrie una din părinte fără override este eroare. Așa, citind clasa, vezi imediat ce metode vin din părinte.
override se poate pune pe metode, câmpuri și accesori și se combină cu alți modificatori: public override, protected override, override readonly.
Exemple
Exemplul 1: Rescriere corectă
class Notificare {
text(destinatar: string): string {
return `Salut, ${destinatar}!`;
}
}
class NotificareFormala extends Notificare {
override text(destinatar: string): string {
return `Stimată doamnă / Stimate domn ${destinatar},`;
}
}
const lista: Notificare[] = [new Notificare(), new NotificareFormala()];
for (const n of lista) console.log(n.text("Popescu"));
Rezultat
Salut, Popescu!
Stimată doamnă / Stimate domn Popescu,
Exemplul 2: Nume greșit prins de override
Metoda părintelui se numește text, nu texte.
class Notificare {
text(): string {
return "Salut!";
}
}
class NotificareFormala extends Notificare {
override texte(): string {
return "Stimate domn,";
}
}
console.log(new NotificareFormala().text());
Eroarea afișată de tsc
exemplu.mts(7,14): error TS4117: This member cannot have an 'override' modifier because it is not declared in the base class 'Notificare'. Did you mean 'text'?
Exemplul 3: Cu noImplicitOverride, cuvântul devine obligatoriu
Fragment din tsconfig.json și eroarea dată pentru o metodă rescrisă fără override.
// tsconfig.json: { "compilerOptions": { "noImplicitOverride": true } }
class Baza {
salut(): string { return "Salut"; }
}
class Derivata extends Baza {
salut(): string { return "Bună ziua"; }
}
Eroarea afișată de tsc
exemplu.mts(6,5): error TS4114: This member must have an 'override' modifier because it overrides a member in the base class 'Baza'.
Greșeli frecvente
- Pui
overrideîntr-o clasă care nu extinde nimic. tsc dă This member cannot have an ‘override’ modifier because its containing class does not extend another class. - Crezi că
overrideschimbă comportamentul la rulare. Doar verifică; codul generat este același.
Comenzi înrudite
extends: O clasă moștenește câmpurile și metodele altei clase; o interfață preia proprietățile altor interfețe.abstract: O clasă abstract nu poate fi instanțiată; metodele abstract trebuie implementate în clasele derivate.class: Clasele din JavaScript, cu tipuri pe câmpuri, constructor și metode, plus modificatori de acces și interfețe.implements: O clasă promite că respectă una sau mai multe interfețe; tsc verifică dacă are toți membrii ceruți.