2015-02-16 16 views
5

Temel sınıfım ve türetilmiş bir tane var, her biri init işlevi.typescript parent sınıfı türetilmiş işlevi çağırıyor

  1. onun temel kurucu diyoruz: i oluşturmak zaman

    türetilen bir i isteyen

    1.1. kendi (türetilmiş) init işlevini çağırır.

Sorun, türetilen init işlevinin iki kez çağrılmasıdır.

Kodu:

class Base{ 
    constructor() { 
     this.init(); 
    } 
    init(){ 
     console.log("Base init"); 
    } 
} 
class Derived extends Base{ 
    constructor() { 
     super(); 
     this.init(); 
    } 
    init(){ 
     console.log("Derived init"); 
    } 
} 
var obj = new Derived(); 

Çıktı:

constructor() { 
    super.init(); 
    super();   
} 

:

Derived init 
Derived init 
+0

init bu tüm hakkında ne yazılır ... size base.init gibi sth yapabilirsiniz türetilmiş() veya super.init(). Ben typescript anahtar kelimesini bilmiyorum - her zaman açıkça Base yöntemini çağırmak zorunda. Ancak teorik olarak interestang bu kötü bir tasarım IMHO olurdu olurdu –

cevap

3

durumda, taban init() çağrılacak ve ardından çocuk init() böyle bunu çözebilir istiyorum example here

012'yi kontrol edin.

İlk olarak çocuk ve daha sonra tabana benzeyen çözüm bu şekilde olmalıdır.

constructor() { 
    super(); 
    //this.init(); 
    super.init(); 
} 

Çalışan bir örnek this playground adresindedir.

biz sadece türetilmiş malzeme kullanılacak istiyorsanız

oluşturulan iki düğme görmek için RUN tıklayın, biz yine init aramak gerekmez:

constructor() { 
    super(); 
    //this.init(); 
    // init will be called in super 
} 

Bu örnek sadece child stuff

+0

Üzgünüm ben bahsetmedim, ama sipariş 1.parent.init, 2.derived.init olmak istedim. – Dorad

+0

Mantıklı olun, sonra sadece 'super.init(); super(); ';);). Ayrıca cevabımı uzattım ve başka bir örnek ekledim ... –

+0

Çirkin, ama bu özel gereksinimler için çalışıyor. Teşekkürler. – Dorad

4

Başka kullanır dan atalarının init işlevini çağırarak

class Base{ 
    constructor() { 
     this.init(); 
    } 
    init(){ 
     var button = document.createElement('button');  
     button.textContent = "base init"; 
     document.body.appendChild(button); 
    } 
} 
class Derived extends Base{ 
    constructor() { 
     super(); 

    } 
    init(){ 
     super.init(); 
     var button = document.createElement('button');  
     button.textContent = "Derived init"; 
     document.body.appendChild(button); 
    } 
} 
var obj = new Derived(); 

: yaklaşım bu (ayrıca Radim parkı örneğini kullanarak) olabilir türetilmiş sınıf istediğiniz akışı elde edebilirsiniz.

Anscestor'un init türetilmiş sınıfta (-es) geçersiz kılınan sanal bir yöntem olduğunu düşünün.

Playground Example

İlgili konular