Oltre ad essere fastidioso e facendo in modo che ogni singolo sottoclasse deve essere toccato quando una classe genitore è aggiornato ...Qual è lo scopo della chiamata super() nelle sottoclassi TS?
risposta
Si consideri il seguente codice:
class A {
protected sum: number;
constructor(protected x: number, protected y: number) {
this.sum = this.x + this.y;
}
}
class B extends A {
constructor(x: number, y: number) {
super(x, y);
}
}
La chiamata a super
nel ctor di classe B
chiama la ctor della classe di A
, e se guardiamo al compilato codice javascript:
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var A = (function() {
function A(x, y) {
this.x = x;
this.y = y;
this.sum = this.x + this.y;
}
return A;
}());
var B = (function (_super) {
__extends(B, _super);
function B(x, y) {
_super.call(this, x, y);
}
return B;
}(A));
dovrebbe essere chiaro il motivo per cui lo facciamo, perché altrimenti tutto ciò accade nel ctor di A
non accadrebbe, ovvero i membri x
, e sum
non verrebbero assegnati nelle istanze della classe B
.
Si potrebbe quindi chiedere "bene, bene, ma perché non succede automaticamente? Perché il compilatore non può chiamare semplicemente super
per me?"
Questa è una domanda giusta, e mi viene in mente 2 motivi principali:
(1) Perché a volte si vuole voler fare qualcosa prima di chiamare super
, ad esempio:
class A {
protected sum: number;
constructor(protected x: number, protected y: number) {
this.sum = this.x + this.y;
}
}
class B extends A {
constructor(x: number, y: number) {
if (x % 2 === 0) {
super(x, y);
} else {
super(x + 1, y);
}
}
}
è necessario chiamare super
prima di accedere a this
nel ctor di B
.
(2) Rende esplicito che questo è ciò che sta accadendo, altrimenti potresti non aspettarti che accada perché non lo vedi.
Questo requisito è valido solo per i costruttori, i metodi di classe non sono richiesti per chiamare il proprio super, ma si è liberi di farlo se si desidera eseguire la funzionalità del metodo principale.
- 1. Qual è lo scopo della classe Expression?
- 2. Qual è lo scopo della dichiarazione anticipata?
- 3. Qual è lo scopo della serratura?
- 4. Qual è lo scopo della lente unita?
- 5. Qual è lo scopo del parametro "& rnd =" nelle richieste http?
- 6. Qual è lo scopo di JMH @Fork?
- 7. Qual è lo scopo delle classi astratte?
- 8. Java: Qual è lo scopo della setDoInput in URLConnection
- 9. Qual è lo scopo di. * \\?
- 10. Qual è lo scopo della distinzione tra maiuscole e minuscole nelle lingue?
- 11. Qual è lo scopo della tabella di collegamento della procedura?
- 12. Qual è lo scopo di EXTRA_CFLAGS?
- 13. Qual è lo scopo di CMakeScripts?
- 14. Qual è lo scopo di UIWindow?
- 15. Qual è lo scopo del metodo Thread.SpinWait?
- 16. Qual è lo scopo di IntentSender?
- 17. Qual è lo scopo di ldexp?
- 18. Qual è lo scopo di IAsyncStateMachine.SetStateMachine?
- 19. Scala: qual è lo scopo dell'override
- 20. Qual è lo scopo della sottoclasse della classe "oggetto" in Python?
- 21. Qual è lo scopo della libreria di servizi WCF?
- 22. Qual è lo scopo della parola chiave `external` in Kotlin?
- 23. Qual è lo scopo della parola chiave volatile in C#?
- 24. Qual è lo scopo dell'utilizzo della libreria Boost.MPI?
- 25. Qual è lo scopo della Tupla (T1)/Singleton in .net?
- 26. Qual è lo scopo della funzione Emacs (eval-and-compile ...)?
- 27. Qual è lo scopo della denominazione dei vincoli
- 28. Qual è lo scopo della finalizzazione in Java?
- 29. Qual è lo scopo principale della proprietà List.single?
- 30. Qual è lo scopo della cartella buildSrc di gradle?
Questo ha senso. Ma non esiste un metodo come _preconstruct() in cui vengono eseguite le funzioni pre-super di quelle sottoclassi? Sembra un modo migliore per andare che forzare ogni sottoclasse a replicare le condizioni del suo genitore. – user3583223
Non sono sicuro di capire la differenza tra ciò che stai suggerendo e l'attuale modo 'super' di fare le cose. –
Penso che @ user3583223 potrebbe suggerire che una funzione '_preconstruct()' potrebbe essere disponibile SOLO per le classi figlie che hanno bisogno di una logica nella chiamata a 'super()'. Tutte le classi figlie che non hanno bisogno di alcuna logica speciale potrebbero semplicemente avere una chiamata implicita a 'super()'. In altre parole, '_preconstruct()' sarebbe completamente opzionale, mentre le chiamate a 'super()' non sono opzionali. – MadScone