![]() |
1
63
抽象类抽象类是一个不是为实例化而设计的类。抽象类不能有任何实现、某些实现或所有实现。抽象类的设计允许其子类共享公共(默认)实现。抽象类的(伪代码)示例如下
子类可能看起来像
可能的用法
如果子类不重写未实现的方法,那么它也是一个抽象类。 界面在一般的计算机科学术语中,接口是程序中暴露给客户的部分。公共类和成员是接口的例子。
Java和C语言有一个特殊的
返回到形状示例
Java和C语言不允许通过实现实现多个类继承,但它们允许多个接口实现。Java和C语言使用接口作为解决方案。 Deadly Diamond of Death Problem 在允许多重继承的语言中发现(如果处理得当,这并不是致命的)。 混合蛋白混合(有时称为特征)允许抽象类的多重继承。MIXIN不具有多重继承的可怕关联(由于C++疯狂),所以人们更容易使用它们。他们有同样致命的致命钻石,但是支持他们的语言有比C++更优雅的减轻它的方法,所以他们被认为是更好的。
混音器被称为与
behavioral reuse
,
more flexible
接口,以及
more powerful
接口。你会注意到所有这些都有这个术语
这并不是说混音不好。多重继承也不错。C++解决多重继承的方式是每个人都在努力解决的问题。 关于疲惫的老样子的例子
您会注意到这和抽象类示例之间没有区别。 另外一个小消息是,C从3.0版开始就支持mixin。您可以使用接口上的扩展方法来实现这一点。下面是带real(!)的形状示例C代码混合样式
|
![]() |
2
20
一般来说: 安 界面 是一个指定操作的合同,但没有任何实现。一些语言(Java,C语言)已经为接口提供了支持,而在其他的“接口”中描述了一个类似于C++中的纯虚拟类的约定。 安 抽象类 是一个类,它指定至少一个没有实现的操作。抽象类还可以提供其实现的某些部分。同样,一些语言也支持将类标记为抽象的,而在其他语言中则是隐式的。例如,在C++中,定义纯虚方法的类是抽象的。 一 混合蛋白 是一个类,其设计目的是使某些功能在子类中的实现更容易,但它本身并没有设计为可供使用。例如,假设我们有一个用于处理请求的对象的接口
也许通过将请求累积到预定的数目,然后刷新缓冲区来缓冲请求是有用的。我们可以使用 混合蛋白 不指定刷新行为:
这样,我们就可以轻松地编写一个请求处理程序,将请求写入磁盘、调用Web服务等,而不必每次都重写缓冲功能。这些请求处理程序可以简单地扩展
mixin的另一个好例子是Spring中许多支持类之一,即。 HibernateDaoSupport . |
|
3
6
引用Java和给定的抽象类实例来提供MIXIN是有误导性的。 首先,Java不支持默认的“MIXIN”。在Java术语中,抽象类和混合集变得混乱。 mixin是一个类可以实现的类型,除了它的“主类型”之外,它还表示它提供了一些可选的行为。用Java术语来说,一个例子就是实现可序列化的业务值对象。 Josh Bloch说,“抽象类不能用来定义MIXIN,因为一个类不能有不止一个父代”(记住Java只允许一个“扩展”候选)。 寻找类似scala和ruby的语言来适当实现“mixin”的概念。 |
![]() |
4
3
抽象类基本上是一个带有一些具体实现的接口。接口只是一个没有实现细节的契约。 如果要创建涉及实现抽象类的所有对象的公共功能,则可以使用和抽象类。保持OOP的干燥(不要重复)原则。 |
![]() |
5
3
因为很多人已经解释了定义和用法,所以我只想强调一些重要的点 接口:
抽象类:
我用一个小例子来结束这个差异。
猫
狗
狗
猫
人
,谁是
人和动物(猫/狗)是不相关的。但Hunt接口可以为无关实体提供相同的功能。 Mixin:
如果我想声明一个抽象类,我将遵循这两种方法之一。
相关SE问题: What is the difference between an interface and abstract class? |
![]() |
6
1
抽象类是一个不是所有成员都实现的类,它们留给继承者实现,它强制继承者实现其抽象成员。 抽象类不能被实例化,因此它们的构造函数不应该是公共的。] 下面是C中的一个例子:
} 接口是一个类要实现的契约,它只声明一个实现类成员的签名,它本身没有实现。我们通常使用接口来实现多态性,并分离依赖类。 下面是C中的一个例子:
|
![]() |
7
1
“混合”的含义在Joshua Bloch的JavaBook书中得到了很好的定义。同一本书的摘录: “ 混合蛋白是一种类型 类除了可以实现它的__primary type_157;之外,还可以实现它来声明它提供 一些可选行为。例如,Comparable是一个 允许类声明其实例是相对于其他实例相互排序的 可比对象。这样的接口称为mixin,因为它允许 可选功能将__与__混合到__类型的主要功能中。 “ |
![]() |
Gabe Tucker · 无法在golang中分配接口对象指针 2 年前 |
![]() |
randomDud · C#从另一个接口重写接口方法 2 年前 |
![]() |
evilsushi · C#接口不允许成员类满足要求 7 年前 |