在TypeScript中,Extends和Implements一個抽象類有什么不同


我們知道在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM