簡體   English   中英

抽象類應該直接實現接口嗎? 優缺點有哪些

[英]Should an abstract class implement interfaces directly. What are the advantages and disadvantages

我正在研究抽象的一些概念,想知道抽象類是否應該直接實現接口,還是應該擴展該類並在子類型中實現接口。

因此,在下面的示例中:

  • 它失去了冗長
  • 動物可以直接用作地球 眾生的類型
interface Being{
    alive:boolean;
}

abstract class Animal implements Being{
    alive:boolean;
}

class Dog extends Animal{
    bark(){
        console.log("Bark");
    }
}

class Earth{
    beings:Being[];
}

該示例可以如下所示重寫:

  • 它比較冗長,您可以看到Dog實現了Being接口
interface Being{
    alive:boolean;
}

abstract class Animal{
    alive:boolean;
}

class Dog extends Animal implements Being{
    bark(){
        console.log("Bark");
    }
}

class Earth{
    beings:Being[];
}

我的問題是:

  1. 第二個例子更好嗎?
  2. 在需要更高版本的情況下,這將是一個例子嗎?
  3. 高版本的優勢是什么?

您甚至可以走得更遠,因為Typescript使用結構兼容性來確定類型兼容性,因此根本不需要實現接口。 例如,它將編譯:

interface Being {
    alive: boolean;
}

abstract class Animal {
    alive: boolean = true;
}

class Dog extends Animal {
    bark() {
        console.log("Bark");
    }
}

class Earth {
    beings: Being[] = [new Dog()]
}

顯式實現接口的優點是,您會在類聲明站點(而不是僅在類使用站點)收到錯誤。

關於問題的主要部分,您應該將implements放在進行實際實施的類上。 如果abstract類實現了接口的所有成員,則最好將implements放在那兒。 如果您的抽象類沒有實現所有方法,並且您希望某些派生類不需要實現接口,則將implements放在需要實現接口的特定類上。

好吧,我認為您已經給了自己答案。 這兩個示例代表了不同的用例,因此我認為沒有“更好的示例”。

讓我們嘗試將其分解為簡單的單詞。

第一個示例,您有一個“存在”,並且所有“動物”都明確具有“ alive”屬性。 在此示例中,這也算為Dog。

但是,在第二個示例中,您的動物不需要具有“活動”屬性。 (然后的問題是,將其設置為真的有意義)。 但是,Dog再次實現了該接口。

因此,如果您說有可能有一只狗,那是一種動物,但不應該具有屬性“活着”(也許是僵屍狗),則應將其放在狗本身上。 但是,如果您無論如何都要將所有字段/函數/邏輯實現到Animal類中(並且您不在乎Zombie-Dogs),則應該將接口放在Animal類上。

因此,這可能不是您正在尋找的“明確”答案。 但這要視情況而定。 您應該始終在相應邏輯所在的地方實現接口。 因此,如果您希望將活着的邏輯放在動物身上,則將它放到那里,如果可以存在沒有活着特性的動物,則將它放到Dog身上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM