Typescript privata egenskaper kan inte nås av subklasser
här är basklassen Person och underklassen Student
class Person {
constructor(private name:string){}
}
class Student extends Person {
greet(){
console.log('Hi, I'm ' + this.name)
}
}
och jag fick felet:
Egenskapen 'name' är privat och endast åtkomlig inom klassen 'Person'.
enligt dokumentationen om automatiska konstruktörer
I en härledd klass har den automatiska konstruktören samma parameterlista (och möjligen överlagringar) som basklassens konstruktor.
så jag trodde att konstruktorn för klassen Student skulle anropa konstruktorn för Person. Jag menar, det är bara ett referensanrop. så jag trodde att klassen Student borde ha sin egen egenskap name
och vad ska jag göra för att se till att klassen Student har sin egen egenskap namn?
Svar #1
Du behöver ändra private till protected. från typescriptlang.org:
TypeScripts privata # TypeScript har också sitt eget sätt att deklarera en medlem som privat, den kan inte nås från utanför sin innehållande klass.
-- betyder att privata fält kommer att finnas i alla underklasser men du kommer inte kunna komma åt det.
Förstå protected # Modifieraren protected fungerar på samma sätt som modifieraren private med den skillnaden att medlemmar som deklareras som protected även kan nås inom klasser som ärver från den.
-- det är vad du behöver, fälten som inte kan nås utifrån men som är tillgängliga i alla underklasser.
Svar #2
Din förvirring kommer från att blanda parametrar med egenskaper. Uttalandet om konstruktorns parametrar är korrekt, den automatiska konstruktorn för Student har samma parametervällista som konstruktorn för Person. Felet är dock inte relaterat till konstruktorns parametrar, utan till användningen av det privata namnet egenskap. Det är inte möjligt att komma åt metod (inklusive konstruktör) parametrar utanför metoden.
Förvirringen skapas huvudsakligen av TS:s syntax för att blanda parametrar med egenskapsdeklarationer. Koden utan syntaktiskt socker:
class Person {
private name: string;
constructor(name: string){
this.name = name;
}
}
För att göra det tydligare:
class Person {
private nameField: string;
constructor(nameParameter: string){
this.nameField = nameParameter;
}
}
Det här är vad du försökte och det fungerade inte på grund av den privata synligheten.
class Student extends Person {
greet(){
console.log('Hi, I'm ' + this.nameField)
}
}
TypeScript och svagt typade språk i allmänhet är ett dåligt val för att lära sig objektorienterad programmering eftersom vissa funktioner saknas eller bara fungerar delvis och du kommer att lära dig dem fel. En annan bra metod är att först lära sig grunderna (dvs. fält kontra egenskaper kontra parametrar), först därefter gå vidare till att använda syntaktiskt socker (genvägar). Prova C#, syntaxen är nästan densamma som TypeScript men det fungerar som förväntat.
