我从来没有能够完全理解多态性是什么。有人可以用一个例子解释它是什么以及它是如何工作的?只是基础知识。
答案 0 :(得分:41)
也许从非计算机类比开始是最容易的。
考虑一下你是否告诉某人“去商店购买一些你最喜欢的食物作为晚餐。”
如果你对一个14岁的儿子这么说,他可能会骑自行车到商店,不得不用现金支付食物,而且你要吃披萨吃晚饭。
如果你对你的妻子说,她可能会开车到商店,用卡片来支付食物,而你可能会用霞多丽吃鸡肉蓝带。
在一个程序中,事情的运作方式有点相同:你在一个相对抽象的层面指定一些东西(去商店吃晚饭)。每个对象都提供了如何实现它的具体实现,并且在许多情况下提供了确切的变化(例如,像上面喜欢的食物的差异)。
当然,当你编程时,大部分都需要一个更加详细和明确的规范。一般的想法仍然是相同的。对于上面的场景,您可能有一个person
基类(或接口),它定义了go to store
和select favorite food
以及pay for purchase
等方法。然后,您将实现adult
和teenager
之类的实现,每个实现都定义了自己的去商店的方法,选择喜欢的食物,并支付购买费用。这些方法将是多态的,因为每个实现都有自己的方式来执行你给出的更高级别的命令。
答案 1 :(得分:16)
从字面上看,多态意味着“有多种形式”。在编程中,如果变量可以包含多种类型的值,那么这就是一种多态性。如果函数可以处理多种类型的参数,那么它也是多态的。
面向对象的语言通过类层次结构具有多态性:对基类或接口的引用可以引用多种类型的对象,只要这些其他类型是从基类派生的。这称为亚型多态性。
通用编程是另一种多态。通过将参数应用于类型,相同的代码位可以处理多种类型的对象。这称为参数多态。
运算符重载和类中方法的重载是另一种多态,称为ad hoc多态,因为它比参数或子类型多态更不系统。
答案 2 :(得分:2)
多态性是指在运行时根据当前上下文选择确切调用函数的能力。
这可以通过描述其他人将从中派生的接口类来完成。人们可以在他的代码中只使用接口而不是使用某些类。这使程序员能够为他的问题选择最佳实现。
作为示例,可以使用数组。可能有两种可能的实现方式,一种是数组稀疏(大量零),另一种是数组满时。不使用一个类直接,而是定义数组类的接口,然后在上下文中选择最佳实现。请参阅以下代码作为整数数组的示例(C ++样式):
class arrayInterface{
...
virtual int getElement(elementPosition)=0
...
}
class sparseArray : public arrayInterface{
...
virtual int getElement(elementPosition){
implementation
}
...
}
class fullArray : public arrayInterface{
...
virtual int getElement(elementPosition){
implementation
}
...
}
main(){
arrayInterface* array = new fullArray();
// this uses now the implementation specified by fullArray
int element = array->getElement(10)
delete array;
array = new sparseArray
// this uses now the implementation specified by sparseArray
int element = array->getElement(10)
}