Poza tym jest denerwujące i czyni go tak, że każda podklasa musi być dotykane, gdy klasa dominująca jest aktualizowana ...Jaki jest cel wywołania super() w podklasach TS?
Odpowiedz
Rozważmy następujący kod:
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);
}
}
Wezwanie do super
w ctor z Klasa B
wywołuje konstruktor klasy A
, a jeśli spojrzymy na skompilowanego kodu 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));
powinno być jasne, dlaczego robimy to, bo inaczej wszystko tak się zdarzy w ctor z A
nie byłoby, czyli członkowie x
, y
i sum
nie zostaną przypisani w przypadkach klasy B
.
Możesz zapytać "no, dobrze, ale dlaczego to nie dzieje się automatycznie, dlaczego kompilator nie może po prostu zadzwonić pod numer super
?"
To dobre pytanie, a ja mogę myśleć o 2 głównych powodów:
(1) Bo czasami chcesz chcą coś zrobić przed wywołaniem super
, na przykład:
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);
}
}
}
Musisz dzwonić super
zanim uzyskasz dostęp do this
w ctor of B
.
(2) Podkreśla to wyraźnie, że tak się dzieje, w przeciwnym razie możesz nie oczekiwać, że tak się stanie, ponieważ go nie widzisz.
To wymaganie jest ważne tylko dla konstruktorów, metody klasy nie są wymagane, aby wywoływać ich super, ale możesz to zrobić, jeśli chcesz uruchomić funkcję metody nadrzędnej.
- 1. Jaki jest cel IApplicationBuilder.New()
- 2. Jaki jest cel curdoc()?
- 3. Jaki jest cel aclocal?
- 4. Jaki jest cel XNoImplicitPrelude?
- 5. Jaki jest cel Ember.Container
- 6. Jaki jest cel $ w XSLT
- 7. Jaki jest cel ldexp?
- 8. Jaki jest cel Rake?
- 9. Jaki jest cel HttpHeaders.TryAddWithoutValidation?
- 10. Jaki jest cel Mage_Core_Block_Template_Facade
- 11. Jaki jest cel CMakeScripts?
- 12. Jaki jest cel preompompiledApp.config?
- 13. Jaki jest cel "() =>"
- 14. Szorowanie blok z wywołania Super
- 15. Jaki jest cel vertexAttribPointer?
- 16. Jaki jest cel używania?
- 17. Jaki jest cel JNDI
- 18. Jaki jest cel IAsyncStateMachine.SetStateMachine?
- 19. Jaki jest cel layout.xml?
- 20. Czy czas wywołania metody super klasy jest ważny w ObjectiveC?
- 21. Jaki jest cel metody Objects.compare()?
- 22. Jaki jest cel Array.GetLowerBound (int)?
- 23. Jaki jest cel Active Records?
- 24. Jaki jest cel przejścia niezdefiniowanego?
- 25. Jaki jest cel pola ValidationResult.Success?
- 26. Jaki jest cel ng eject?
- 27. Jaki jest cel javax StreamSource
- 28. Jaki jest cel `__metaclass__ = type`?
- 29. Jaki jest cel "oddziału integracyjnego"?
- 30. Jaki jest cel używania CommandType.Tabledirect
To ma sens. Ale czy nie mogłaby istnieć metoda taka jak _preconstruct(), w której wykonywane są pre-super funkcje tej podklasy? Wydaje się, że jest to lepszy sposób niż zmuszanie każdej podklasy do replikowania warunków jej rodzica. – user3583223
Nie jestem pewien, czy rozumiem różnicę między tym, co sugerujesz, a obecnym "super" sposobem robienia rzeczy. –
Myślę, że @ user3583223 może sugerować, że funkcja '_preconstruct()' może być dostępna TYLKO dla klas potomnych, które potrzebują logiki w wywołaniu 'super()'. Wszystkie klasy potomne, które nie potrzebują żadnej specjalnej logiki, mogą mieć niejawne wywołanie 'super()'. Innymi słowy, '_preconstruct()' byłoby całkowicie opcjonalne, natomiast wywołania 'super()' nie są opcjonalne. – MadScone