由接口定义的关系术语

6
如果继承是实现“is-a”关系的面向对象技术,而组合/聚合实现了“has-a”关系,那么Java/.NET风格接口所实现的关系应该用什么名称呢?
个人推荐使用“can-do”关系这一术语,因为这些接口通常用于指定支持的操作,如“可排序(Sortable)”,“可克隆(Clonable)”等,听起来具有肯定性。我想到的唯一一个比较常见的名称是“realizes”关系,但它并不能真正描述这种关系。
3个回答

2
在大多数面向对象编程语言中,接口和类都通过继承来表达它们之间的关系,而继承是一种“is-a”关系,无论是接口、类还是抽象类等等。
事实上,类本身也是某种类型的接口,它们只是同时提供了实现。没有实现的抽象类与接口之间并没有太大的区别,尽管内部实现可能有些差异(最大的差异在于在Java和.NET中,您不能继承多个抽象类)。
因此,从概念上讲,“is-a”就是继承,“has-a”就是包含/组合/聚合/你想叫它什么就叫什么。
“realizes”这个术语更像是“inherits”或“subclasses”的子类。您不能对接口进行子类化,但可以实现它。这更多是一个精细的细节,尽管它具有特定的含义。
并非所有语言都有接口。例如,C++就没有。然而,您可以使用没有实现的抽象类来模拟它们,就像我之前提到的那样。但由于C++允许多重继承,所以这个问题不是那么严重(只要它们是纯抽象类,没有实现,如果您开始将代码混合到其中,那么情况就会变得更加复杂)。

接口的概念与继承无关。 - Mik378
1
@Mik378 - 确实,一些语言(如Smalltalk)可以在没有继承的情况下实现接口。它们只需要实现接口实现的所有成员,然后它们就“是一个”接口。99.9%的面向对象编程语言都通过继承来实现接口,而且我所知道的每种语言中继承都是接口的一种形式(否则,多态性就无法工作)。 - Erik Funkenbusch
@Mik378 - 但是Smalltalk可以通过这种方式执行任何类型的is-a关系,而无需继承。如果两个对象具有相同的签名,则一个对象就是“另一个对象”。C#也可以使用动态变量执行相同的操作。 - Erik Funkenbusch

1

你可能最关心的术语是:角色(Role)

接口描述了一个角色

这就是为什么很多接口都有后缀“able”:CloneableSerializableRunnable等。

这就像分配一个或多个角色


我不会将其称为面向对象编程术语,尽管某些面向对象编程方法可能使用该术语。我倾向于坚持大多数方法都认同的常用术语。 - Erik Funkenbusch
@Erik,原帖只是关于Java/.NET的。 - Mik378
不,这个问题是关于如何用面向对象的术语来标记C#/Java的特定功能。 - Erik Funkenbusch
1
我没有提到任何语言,我说的是方法论。方法论定义术语和命名规则。 - Erik Funkenbusch

0

is-a 也适用于接口。在 Java 中,ArrayList is-a List,而 TreeMap is-a Map

如果您编写一个接受 List 作为参数的方法:

public void someMethod(List someList) {
    // ...
}

ArrayList 的实例作为参数传递给该方法是有效的,因为 ArrayList 是一个 List


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接