2017-03-16 115 views
1

希望你們中的一個angular2 /打字稿嚮導可以幫忙,或至少提供了正確的方向指針,之前我瘋了:-)angular2 /打字稿類的繼承與泛型類型

這裏是我的倒是喜歡

  • 父類實現它自己定義的父接口,但使用泛型類型這樣我就可以創建一個子類時,它提供了孩子的具體和定製類&數據接口。
  • 子類應該能夠
    • 能夠覆蓋缺省的/父集變量
    • 覆蓋父功能(擴展父數據類)並調用,而不是父母的孩子的版本默認

在下面的僞代碼示例,我想打電話給孩子的(繼承)someOtherfunction()返回「2」 ...

我問太多了嗎? 我似乎無法在網上找到任何像樣的例子...

我該如何解決這個問題?

謝謝 - 奧利弗

(下面的代碼可能被打破,它只是爲了舉例說明)

// 
// Parent Class 
// 

export interface ICoreData <T> { 
    observeItems: Observable <T[]> ; 
    items: Array <T>; 
} 

@Injectable() 
export class CoreData<T> implements ICoreData<T> { 

    public observeItems: Observable<T[]>; 
    private items: Array<T>; 

    constructor('Dependency Injection...') {} 

    coreFunction(): number { 
     return 1; 
    } 
    someOtherfunction(){ 
     return this.coreFunction(); 
    } 
} 

// 
// Child class 
// 

export interface IMyDataStructure { 
    name: string; 
    age: string;  
} 

export interface ISpecificData extends ICoreData<IMyDataStructure> { 
    someExtraKey: number; 
} 

@Injectable() 
export class SpecificData extends CoreData<IMyDataStructure> implements ISpecificData { 

    constructor() { 
     super(); 
    } 

    coreFunction(): number{ 
     // 
     // This function should "overwrite" the parent's original function 
     // and be called by the parent's someOtherfunction() function 
     // 
     return 2; 
    } 
} 
+0

你對上面的代碼有什麼問題?那裏沒有兒童班,順便說一句。 – estus

+0

爲什麼用'@Injectable()'註解''''''?你的依賴注入問題? – Springrbua

+0

以上不編譯;儘管我給了它最好的嘗試,但對於我想實現的目標(按照我的描述),它似乎是錯誤的或至少不是完全正確的方法。 回覆:DI,我甚至沒有得到那麼遠的測試。 – olivermuc

回答

1

你不能要求太多了。但是,您無法使用interface來完成您要完成的任務。您需要擴展一個class,這可能是通用的。

對於數據類型,interface只是合同或藍圖(如果您喜歡的話)。沒有與interface相關的功能。然而,在你的情況下,你希望能夠在基類上有方法;您可以在派生中重寫的方法。

我通常這樣做的方式是聲明一個abstract基類(以便基類不能自己實例化),然後是extend類。這裏有一個例子:

請注意,我已經刪除了所有的Angular2 cruft以保持示例儘可能簡單。

abstract class Base<T> { 
    constructor(public controlled: T) { } 

    doIt(): string { 
    return `Base.doIt: ${JSON.stringify(this.controlled)}`; 
    } 

    doSomethingElse(): string { 
    return `Base.doSomethingElse: ${JSON.stringify(this.controlled)}`; 
    } 
}; 

interface Foo { 
    foo: string; 
    bar: string; 
}; 

class Derived extends Base<Foo> { 
    constructor(foo: Foo) { 
    super(foo); 
    } 

    doSomethingElse(): string { 
    return `Derived.doSomethingElse: ${JSON.stringify(this.controlled)}`; 
    } 
}; 

let d: Derived = new Derived({ foo: 'foo', bar: 'bar' }); 

console.log(`doIt ==> ${d.doIt()}`); 
console.log(`doSomethingElse ==> ${d.doSomethingElse()}`); 

輸出:

doIt ==> Base.doIt: {"foo":"foo","bar":"bar"} 
doSomethingElse ==> Derived.doSomethingElse: {"foo":"foo","bar":"bar"} 

Playground link

+0

謝謝你,約翰。 我添加的接口部分BC我想我需要這個來確保應用程序廣泛的自動完成/檢查類方法和不同的數據(結構)。每個孩子可能會有所不同。 也就是說。在你的情況下,它可能是** Foo **爲一個孩子,並** FooFoo **(與其他數據屬性爲另一個 **基地/兒童功能:** 你的例子不觸及兩個函數相互作用,例如: 基數: 'doIt():string { return doSomethingElse(); }' - 如果'base.doIt()'會調用'base.doSomething()'然後'child ('base inherited')。doIt()''調用'child.doSomething()'? – olivermuc

+0

噢,最後一個:我可以使用上面的Injectable服務嗎?即不使用** new Derived()* *方法 – olivermuc

+0

順便說一句,謝謝你的Playground鏈接,該服務是值得純金。 隨着你的指針和快速測試的選項...我得到它....張貼如下 – olivermuc