假设我们有一个抽象类,让这个类只有抽象方法。这个抽象类与只有相同方法的接口不同吗?
我想知道的是,在哲学上、客观上以及底层编程语言实现中,只有抽象成员和等效接口的抽象类之间是否存在任何差异?
发布于 2013-04-19 12:38:52
从技术上讲,这些差异并不是真正重要的,但在概念上,它们是完全不同的,这导致了其他人提到的技术差异。
抽象的超类就像它听起来的那样,它是许多其他类型共享的公共类型,比如猫和狗是动物。
接口也正是它听起来的样子,它是其他类可以通过它与对象通信的接口。如果您想要进行猫步行,您可以,因为猫实现了一个CanWalk接口。蜥蜴也是如此,尽管它们走路的方式很不一样。另一方面,Snake不实现CanWalk,所以您不能告诉它步行。同时,蜥蜴和蛇(或可能更显式的子类-我不是专家-)可能都会脱皮,从而实现CanShed,而猫是做不到的。
但它们仍然是动物,它们有一些共同的属性,比如它们是活着的还是死的。
这就是为什么接口上的所有方法都必须实现为公共的(或者显式地,在C#中)。因为,隐藏在与对象接口的类中的接口有什么意义?这也是为什么您可以拥有一个对象的多个接口,即使一种语言不支持多重继承。
回到你的问题,当你这样看待它的时候,很少有理由有一个完全抽象的超类。
发布于 2013-04-19 12:10:26
在大多数OOP语言中,实现类只能从一个抽象类派生,但可以实现多个接口。
发布于 2013-04-19 13:21:59
在像C++这样的语言中,允许多个继承,并且没有接口,所有方法都是抽象的抽象类可以充当接口。我使用C++的次数不多,但当基类中有同名的方法时,我想多重继承可能会造成问题。
在PHP和C#等语言中,接口提供了一种实现类似多态性的方法,尽管我不喜欢称之为“继承”,因为继承抽象类和实现接口在概念上是有区别的。接口消除冲突问题,因为它们本身不提供任何实现。
接口充当与外部世界的契约,而抽象类可以提供实现,尽管如果用来“伪造”接口,它很可能不会。
主要的概念区别是,当一个类继承另一个类(抽象或非抽象)时,存在" is“的关系,所以Car是Vehicle,Dog是Animal。有了接口,重要的是对象做了什么。因此,Car和Dog都可以实现Move(),消费者也知道这一点,因为它们实现了Movable,但汽车肯定不是Dog,也不是Animal。而且move实现将是不同的(轮子和腿),但是消费代码不需要也不应该关心。接口都是关于消耗代码的,而不是实现。
要点是,如果您在选择的语言中有接口,请将它们用于实现它们的目的。如果不是(就像在C++中),您可以使用纯抽象类来伪造它们。
https://softwareengineering.stackexchange.com/questions/195470
复制相似问题