【问题标题】:Should an abstract class implement interfaces directly. What are the advantages and disadvantages抽象类是否应该直接实现接口。有什么优点和缺点
【发布时间】:2018-03-29 14:47:46
【问题描述】:

我正在研究一些抽象概念,想知道抽象类是否应该直接实现接口,或者您应该扩展类并在子类型中实现接口。

所以在下面的例子中:

  • 不再冗长
  • 动物可以直接作为地球中众生的类型
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. 高版本有什么优势?

【问题讨论】:

  • "现在你不能将 Animal 直接放在beings数组中" 是的,你可以试试。结构兼容性。
  • 无论如何你都不能把 Animal 的实例直接放在那里,因为它是一个抽象类。

标签: javascript typescript abstraction


【解决方案1】:

嗯,我想你已经给了自己答案。这两个例子代表不同的用例,所以我认为没有“更好的例子”。

让我们试着把它分解成简单的单词。

第一个例子,你有一个存在,所有的动物都明确地具有“活着”的属性。在本例中,这也适用于 Dog。

然而,在第二个示例中,您的 Animal 不需要具有“alive”属性。 (那么问题是,拥有它是否真的有意义)。然而,Dog 再次实现了该接口。

所以如果你说有可能有一只狗,那是一只动物,但不应该有“活着”的属性(也许它是一只僵尸狗),你应该把它放在狗身上。但是,如果您要在 Animal 类中实现所有字段/功能/逻辑(并且您不关心 Zombie-Dogs),您应该将接口放在 Animal 类中。

所以这可能不是您正在寻找的“明确”答案。但这取决于具体情况。您应该始终在相应逻辑所在的位置实现接口。因此,如果您希望将活动逻辑放在动物身上,请将其放在那里,如果可能存在没有活动属性的动物,请将其放在 Dog 本身上。

【讨论】:

    【解决方案2】:

    你可以更进一步,你根本不需要实现接口,因为 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放在需要实现接口的具体类上。

    【讨论】:

      猜你喜欢
      • 2011-06-04
      • 2014-09-07
      • 2018-07-19
      • 1970-01-01
      • 2015-11-24
      • 2012-07-17
      • 2016-01-15
      • 2010-10-12
      • 2010-09-08
      相关资源
      最近更新 更多