private und public
Jeder Code kann jedes Feld eines Objekts ändern. Eine unvorsichtige Zeile irgendwo im Spiel, und Kira hat negatives Gold:
class Held {
name: string;
gold: number = 0;
constructor(name: string) {
this.name = name;
}
verdiene(betrag: number): void {
this.gold = this.gold + betrag;
}
}
const kira = new Held("Kira");
kira.verdiene(50);
kira.gold = kira.gold - 80; // kauft ein Schwert für 80 Gold
console.log(`${kira.name} hat ${kira.gold} Gold`);Das gibt aus:
Kira hat -30 GoldDie Klasse sollte ihr Gold schützen: Nur ihre eigenen Methoden sollten es ändern, und sie können die Regeln prüfen. Markiere das Feld als private:
class Held {
name: string;
private gold: number = 0;
constructor(name: string) {
this.name = name;
}
verdiene(betrag: number): void {
this.gold = this.gold + betrag;
}
bezahle(betrag: number): boolean {
if (betrag > this.gold) {
return false;
}
this.gold = this.gold - betrag;
return true;
}
holeGold(): number {
return this.gold;
}
}
const kira = new Held("Kira");
kira.verdiene(50);
console.log(kira.bezahle(80));
console.log(kira.bezahle(30));
console.log(`${kira.name} hat ${kira.holeGold()} Gold`);Das gibt aus:
false
true
Kira hat 20 GoldEin private-Feld kann nur innerhalb der Klasse verwendet werden, in ihren Methoden, über this. Code außerhalb der Klasse kann es weder lesen noch ändern. Füge am Ende des Programms kira.gold = 1000; hinzu, und TypeScript meldet:
main.ts(31,6): error TS2341: Property 'gold' is private and only accessible within class 'Held'.Der Rest des Spiels kommt über die Methoden an das Gold, und sie halten die Regeln ein: bezahle gibt false zurück und ändert nichts, wenn nicht genug Gold da ist, und mit holeGold können andere das Gold lesen, ohne es ändern zu können. Felder und Methoden ohne private sind public: Jeder kann sie verwenden. Das ist der Standard. Du kannst auch ausdrücklich public schreiben (public name: string;), aber das tun die meisten nicht.
Wie readonly in der Lektion Objekttypen wird private nur von TypeScript geprüft. In JavaScript ist gold eine gewöhnliche Eigenschaft, und console.log(kira) zeigt sie weiterhin: Held { name: "Kira", gold: 20 }. JavaScript hat auch eigene private Felder, deren Namen mit # beginnen (#gold); die bleiben auch beim Ausführen des Programms verborgen. Du wirst beide Arten in anderem Code sehen; dieser Kurs verwendet private.
Typische Fehler: ein privates Feld von außerhalb der Klasse lesen (füge eine Methode hinzu, die es zurückgibt, wie holeGold) und eine Methode privat machen, die der Rest des Programms aufrufen muss.
So schreibst du es:
Anweisungen
- 1
Führe das Programm aus: Lena hat am Ende negatives Mana. Füge eine Methode
zaubere(kosten: number): booleanhinzu: Hat der Magier weniger Mana alskosten, gibt siefalsezurück und ändert nichts; sonst zieht siekostenvonmanaab und gibttruezurück. Ersetze beide Zeilen, dielena.manaändern, durchconsole.log(lena.zaubere(15));. Das Programm gibt aus:true false Lena hat 5 Mana - 2
Damit niemand
zaubereumgehen kann, machemanaprivat: Schreibeprivatevor das Feld. TypeScript meldet dann die letzte Zeile, dielena.manavon außerhalb der Klasse liest. Füge eine MethodeholeMana(): numberhinzu und verwende sie in dieser Zeile. Das Programm gibt dasselbe aus wie vorher.