cevap
Aşağıdaki kodu düşünün:
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);
}
}
ait ctor içinde super
çağrısı sınıf B
sınıfının A
ait ctor çağırır ve biz derlenmiş javascript kodu bakarsak:
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));
yaptığımız açıktır neden olması gerektiğini, aksi takdirde her şey çünkü A
'un cetinde gerçekleşmez, bu x
, y
ve sum
üyelerine B
sınıfının örneklerinde atanmaz.
Daha sonra "iyi, sorun değil, ama neden otomatik olarak gerçekleşiyor? Neden derleyici neden benim için super
'u arayamıyor?" bazen örneğin super
çağırmadan önce bir şey yapmak istiyorum istediğimiz için
(1):
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);
}
}
}
Sen super
çağırmalıdır adil bir soru ve ben 2 ana neden sayabilirim
B
'un cetveline this
erişmeden önce.
(2) Bunun olup bittiğini açıkça ortaya koyar, aksi halde bunu görmediğiniz için gerçekleşmesini beklemezsiniz.
Bu gereksinim yalnızca kurucular için geçerlidir, sınıf yöntemlerinin super'larını çağırması gerekmez, ancak üst yöntem işlevini yürütmek istiyorsanız bunu yapmakta özgürsünüz.
Bu mantıklı. Ama bu alt sınıfın süper öncesi işlevlerinin yürütüldüğü _preconstruct() gibi bir yöntem olamaz mı? Her bir alt sınıfı ebeveyninin koşullarını çoğaltmak için zorlamaktan daha iyi bir yol gibi görünüyor. – user3583223
Önerileriniz ile mevcut 'süper' şeyler yapma arasındaki farkı anladığımdan emin değilim. –
Bence @ user3583223 bir '_preconstruct()' fonksiyonunun SADECE 'super()' çağrısında bazı mantık gerektiren alt sınıflar için mevcut olabileceğini düşündürüyor olabilir. Özel bir mantığa ihtiyaç duymayan tüm çocuk sınıfları, yalnızca 'super() 'ile örtülü bir çağrıda bulunabilir. Diğer bir deyişle, '_preconstruct()' tamamen isteğe bağlı olurken, super() 'çağrıları isteğe bağlı değildir. – MadScone