2016-07-07 13 views

cevap

5

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.

+0

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

+0

Önerileriniz ile mevcut 'süper' şeyler yapma arasındaki farkı anladığımdan emin değilim. –

+0

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