有人可以向我解释多态吗?

时间:2011-10-12 23:55:17

标签: oop polymorphism

  

可能重复:
  Try to describe polymorphism as easy as you can

我从来没有能够完全理解多态性是什么。有人可以用一个例子解释它是什么以及它是如何工作的?只是基础知识。

3 个答案:

答案 0 :(得分:41)

也许从非计算机类比开始是最容易的。

考虑一下你是否告诉某人“去商店购买一些你最喜欢的食物作为晚餐。”

如果你对一个14岁的儿子这么说,他可能会骑自行车到商店,不得不用现金支付食物,而且你要吃披萨吃晚饭。

如果你对你的妻子说,她可能会开车到商店,用卡片来支付食物,而你可能会用霞多丽吃鸡肉蓝带。

在一个程序中,事情的运作方式有点相同:你在一个相对抽象的层面指定一些东西(去商店吃晚饭)。每个对象都提供了如何实现它的具体实现,并且在许多情况下提供了确切的变化(例如,像上面喜欢的食物的差异)。

当然,当你编程时,大部分都需要一个更加详细和明确的规范。一般的想法仍然是相同的。对于上面的场景,您可能有一个person基类(或接口),它定义了go to storeselect favorite food以及pay for purchase等方法。然后,您将实现adultteenager之类的实现,每个实现都定义了自己的去商店的方法,选择喜欢的食物,并支付购买费用。这些方法将是多态的,因为每个实现都有自己的方式来执行你给出的更高级别的命令。

答案 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)

}