![](/img/trans.png)
[英]What are the advantages and disadvantages of using Jquery UI with AngularJS?
[英]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[];
}
該示例可以如下所示重寫:
interface Being{
alive:boolean;
}
abstract class Animal{
alive:boolean;
}
class Dog extends Animal implements Being{
bark(){
console.log("Bark");
}
}
class Earth{
beings:Being[];
}
我的問題是:
您甚至可以走得更遠,因為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.