2017-01-22 8 views
1

アングル2では、すべてがインターフェイスを実装するため、多くのクラスを配列として使用できますか?たとえば:配列として多くのクラスを消費する

interface IWorker { 
    doWork(); 
} 

class WorkerA implements IWorker { 
    doWork() {...} 
} 

class WorkerB implements IWorker { 
    doWork() {...} 
} 

class MainWorker { 
    constructor(private workers: IWorker[]) { 
    } 

    doWork() { 
     this.workers.forEach(w => w.doWork()); 
    } 
} 
+0

を参照してください。プライベートワーカー:WorkerA 'はClass not Interfaceを期待しており、通常は同じ型のクラスを作成し、 'worker'オブジェクトに格納します。 FTRを型キャストするだけではありません。だから答えはいいえ! – codef0rmer

+0

あなたが求めようとしていることについてより正確にお答えください。これは、何かの配列( 'something']ではなく '[something]')の配列の正しい構文ではなく、 'this.'が欠けていますが、インターフェイス型の配列を持つことができます。それを反復し、そのインタフェースを使用してそれらとやり取りします。あなたは動作しないコードを持っていますか([mcve]を提供していますか?)あなたは配列の依存性注入について尋ねていますか? – jonrsharpe

+0

@jonrsharpeがコードを修正しました。私が達成しようとしているのは、すべてのクラスにインターフェイスを実装して単一の配列に挿入することです。私は、労働者階級にすべての種類の労働者を輸入させたくありません。私は、ワーカーを追加して、ワーカーを変更せずにワーカー配列に注入できるようにしたいと考えています。 –

答えて

0

代わりインターフェースのIWorker抽象基本クラスを作ることができます。インタフェース情報は実行時に利用できないため、Angulars DIではインタフェースをサポートしていません。

また、インターフェイスの代わりに文字列またはOpaqueTokenをキーとして使用することもできます。

文字列のキー例:

@Injectable() // <<<=== required if DI should inject parameters 
class MainWorker { 
    constructor(@Inject('IWorker') private workers: IWorker[]) {} 

    doWork() { 
     this.workers.forEach(w => w.doWork()); 
    } 
} 

配列としてWorkerAMainWorkerに渡さWorkerBを取得するには、彼らがuseMulti: true

providers: [ 
    {provide: 'IWorker', useClass: WorkerA, useMulti: true}, 
    {provide: 'IWorker', useClass: WorkerB, useMulti: true}, 
] 

に登録する必要があります `、活字体でもWhat is in Angular 2 Opaque Token and What's the Point?

+0

ありがとう!私はこれを確認します。 –

関連する問題