我只是想添加我自己对多态性的解释:非常一般地,多态性是为不同类型的实体提供单个接口的行为。
这是相当通用的,但这是我能想到的唯一方法来包装我所知道的所有三种类型的多态性:ad hoc、parametric和subtype。我将在下面详细介绍,并按名称按字母顺序对多态类型进行排序。您感兴趣的最有可能是subtype polymorphism,这是最后一个。
特设多态性
Ad hoc 多态性是为不同的参数类型提供同一方法的多个实现的行为。在OOP中,它通常被称为方法重载。例如:
public String format(int a) {
return String.format("%2d", a);
}
public String format(Date a) {
return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(a);
}
这两种format
方法共享一个接口,但它们适用于不同类型的实体。
参数多态性
参数多态性是使类(或方法)在本身是类(或方法)参数的类型上工作的行为。它通常被称为泛型。
例如,Java在实例化时List[T]
需要一个参数T
,这个参数定义了结果对象的类型。
纯粹主义者请注意,我故意忽略原始类型,因为我觉得在这种情况下它们只会使水变得浑浊。
List[String]
并List[Date]
共享一个界面,但使用(并且是)不同的类型。
亚型多态性
子类型多态性可能是您最初在问题中的意思:它是为同一类型的多个实现提供单个接口的行为。
使用习惯示例:Animal
提供所有实现都必须遵守的契约。Dog
是一个Animal
,因此支持所有Animal
声明的操作。根据Liskov 替换原则,这允许您使用期望Dog
的实例的实例(但不能反过来)。Animal
如果Cat
和Dog
都是 的子类Animal
,那么它们共享一个接口,但实际上是不同的类型。
我在这里有点切题,但是(我认为)子类型多态是唯一允许覆盖的:重新定义由父类定义的方法的行为的行为。这经常与重载相混淆,正如我们之前所见,重载是一种多态性,实际上不需要子类化(实际上也不需要类)。