2013-07-25 20 views
12

Birden çok arabirimi tek bir soyut sınıfa birleştirmek için bir desen bulmaya çalışıyorum. Şu anda, "arabirimler" aracılığıyla birden fazla arabirimi birleştirebilirim ancak bir arabirim bir kurucu bildiremez. Bir kurucuyu tanıtmam gerektiğinde, soyut bir ders kullanmaya zorlandım. Soyut bir sınıf kullandığımda, tüm bileşik arabirimi yeniden bildirmeliyim! Elbette bir şey mi eksik?Çok amaçlı kalıtım çözümleri mi yazıyor?

interface ILayerInfo { 
    a: string; 
} 

interface ILayerStatic { 
    b(): string; 
} 

class Layer implements ILayerInfo, ILayerStatic { 
    constructor(info: ILayerInfo); 
    a: string; 
    b(): string; 
} 

CEVAP: kullanım 'yeni': örnek üyeleri ile aynı arabirimde bir kurucu bildirmek

interface Layer extends ILayerInfo, ILayerStatic { 
    new(info: ILayerInfo); 
} 

// usage: new Layer({ a: "" }); 

cevap

21

gerçekten çok mantıklı değil - Bir geçmek için gidiyoruz eğer Bir kurucuda kullanmak için dinamik olarak yazın, kısıtlanacak sınıfın statik tarafıdır.

interface Colorable { 
    colorize(c: string): void; 
} 

interface Countable { 
    count: number; 
} 

interface ColorCountable extends Colorable, Countable { 
} 

interface ColorCountableCreator { 
    new(info: {color: string; count: number}): ColorCountable; 
} 

class ColorCounted implements ColorCountable { 
    count: number; 
    colorize(s: string) { } 
    constructor(info: {color: string; count: number}) { 
     // ... 
    } 
} 

function makeThings(c: ColorCountableCreator) { 
    var results: ColorCountable[]; 
    for(var i = 0; i < 10; i++) { 
     results.push(new c({color: 'blue', count: i})); 
    } 
    return results; 
} 

var items = makeThings(ColorCounted); 
console.log(items[0].count); 

Ayrıca bkz How does typescript interfaces with construct signatures work?

+0

Ben eksikti arayüzünde "yeni" anahtar kelime idi: Ne yapmak isteyeyim muhtemelen böyle bir şey! Dersi hiç istemedim. "Yeni" ile arayüzlere yapışabilirim. –