我們知道在TypeScript中一個類既可以被implement也可以被extends的
有一些C#或java基礎的同學可能會對此感到困惑
因為在上述兩個面向對象的語言里面只有接口可以被implement,而只有類才能被extends。
那我們來解釋一下在TypeScript中這兩個關鍵詞有什么不同。
最近在StackOverflow中查到了這個問題,所以順手翻譯了一下並且記錄了下來
原文的地址是:https://stackoverflow.com/questions/35990538/extending-vs-implementing-a-pure-abstract-class-in-typescript/35990799#35990799
問題描述
Extending vs. implementing a pure abstract class in TypeScript
假設我有一個干凈的抽象類A:
abstract class A { abstract m(): void; }
在繼承(extends)方面,就像C#或者java里面那樣,我可以像下面這樣來繼承這個抽象類:
//TypeScript
class B extends A{
}
但是在實現方面(implement),在TypeScript中也可以去implement一個類:
class C implements A { m(): void { } }
那么問題來了:類B和類C在行為上有什么不同?我該如何選擇?
問題解答
implements關鍵字將類A當作一個接口,這意味着類C必須去實現定義在A中的所有方法,無論這些方法是否在類A中有沒有默認的實現。同時,也不用在類C中定義super方法。
而就像是extends關鍵字本身所表達的意思一樣,你只需要實現類A中定義的虛方法,並且關於super的調用也會有效。
我想在抽象方法的情況下,這並沒有什么區別。但是很少有只使用抽象方法的類,如果只使用抽象方法,最好將其轉換為接口。
轉載於:https://www.cnblogs.com/pangjianxin/p/10901115.html