Wenn eine Superklasse eine Funktion aus einer Unterklasse aufrufen soll, ist es am saubersten, ein abstraktes Muster zu definieren. Auf diese Weise wissen Sie explizit, dass die Methode irgendwo existiert und von einer Unterklasse überschrieben werden muss.
Dies ist ein Beispiel. Normalerweise rufen Sie keine Submethode innerhalb des Konstruktors auf, da die Subinstanz noch nicht initialisiert ist. (Grund, warum Sie im Beispiel Ihrer Frage ein "undefiniert" haben.)
abstract class A {
protected abstract doStuff():void;
constructor(){
alert("Super class A constructed, calling now 'doStuff'")
this.doStuff();
}
}
class B extends A{
protected doStuff()
{
alert("Submethod called");
}
}
var b = new B();
Testen Sie es hier
Und wenn Sie wie @Max wirklich vermeiden möchten, die abstrakte Methode überall zu implementieren, entfernen Sie sie einfach. Ich empfehle diesen Ansatz nicht, da Sie möglicherweise vergessen, dass Sie die Methode überschreiben.
abstract class A {
constructor() {
alert("Super class A constructed, calling now 'doStuff'")
this.doStuff();
}
protected doStuff(): void {
alert("Default doStuff");
};
}
class B extends A {
protected doStuff() {
alert("Submethod called");
}
}
class C extends A {
}
var b = new B();
var c = new C();
Probieren Sie es hier aus