typescript - Varför kan inte abstrakta skyddade metoder kallas från underklasser?
Här är en förenklad version av vad jag ville ha i ett projekt :
abstract class Parent {
protected abstract method(): any;
}
class Child extends Parent {
protected method(): any {}
protected other() {
let a: Parent = new Child()
a.method()
}
}
class Other extends Parent {
protected method(): any {}
}
Detta misslyckas när man försöker kalla a.method(). Felet lyder som följer:
Property 'method' is protected and only accessible through an instance of class 'Child'.
Lekplatslänk
Såvitt jag förstår kommer problemet från det faktum att a.method() inte kallas från själva instansen a. Men ändå, det kallas från en Child-instans, så felet verkar konstigt. Är inte instanser av samma basklass "vänner" med varandra?
Och slutligen, hur kan jag lösa mitt problem utan att förlora fördelarna som följer med protected? Tack.
Svar #1
Enligt TypeScript-specifikationerna, om en variabel i basklassen är skyddad kan vi inte använda den direkt från en härledd klass på ett objekt som inte är 'this'. Så du kan anropa this.method(), men inte a.method().
Nästan sista stycket på sida 120 i TS-specifikationen: https://github.com/microsoft/TypeScript/blob/master/doc/TypeScript%20Language%20Specification.pdf
Svar #2
Det verkar för mig som att du har fel. När du gör let a: Parent=new Child(); är du utanför klassen, och det är därför TS-kompilatorn varnar dig. Du kan kalla this.method() utan problem, eftersom den här gången är anroparen en Parent-instans.
abstract class Parent {
protected abstract method(): any;
}
class Child extends Parent {
protected method(): any {}
protected other() {
this.method(); // here
}
}
class Other extends Parent {
protected method(): any {}
}
Lekplatslänk
