多态在面向对象语言中是个很普遍的概念。虽然我们经常把多态混为一谈,但实际上 有四种不同类型的多态。在开始正式的子类型多态的细节讨论前,然我们先来看看普通面向对象中的多态。
Luca Cardelli和Peter Wegner("On Understanding Types, Data Abstraction, and Polymorphism"一文的作者, 文章参考资源链接)把多态分为两大类----特定的和通用的----四小类:强制的,重载的,参数的和包含的。
他们的结构如下:498)this。style。width=498;" border=0>
在这样一个体系中,多态表现出多种形式的能力。通用多态引用有 相同结构类型的大量对象,他们有着共同的特征。特定的多态涉及的是小部分没有相同特征的对象。四种多态可做以下描述:
◆强制的:一种隐 式做类型转换的方法。
◆重载的:将一个标志符用作多个意义。
◆参数的:为不同类型的参数提供相同的操作。
◆包含的:类包含关系的抽象操作。
我将在讲述子类型多态前简单介绍一下这几种多态。
强制的多态
强制多态隐式的将参数按某种方法,转换成编译器认为正确的类型以避免错误。
在以下的表达式中,编译器必须决定二元运算符‘+’所应做的工作:
2。0 + 2。0
2。0 + 2
2。0 + "2"
第一个表达式将两个double的 操作数相加;Java中特别声明了这种用法。
第二个表达式将double型和int相加。
Java中没有明确定义这种运算。不过,编 译器隐式的将第二个操作数转换为double型,并作double型的加法。做对程序员来说十分方便,否则将会抛出一个编译错误,或者强制程序员显式的将 int转换为double。
第三个表达式将double与一个String相加。
Java中同样没有定义这样的操作。所以,编译器将 double转换成String类型,并将他们做串联。
强制多态也会发生在方法调用中。假设类Derived继承了类Base,类C 有一个方法,原型为m(Base),在下面的代码中,编译器隐式的将Derived类的对象derived转化为Base类的对象。
这种隐式的转换使 m(Base)方法使用所有能转换成Base类的所有参数。
全部