88

我看过其他定义和解释,但没有一个能让我满意。我想看看是否有人可以在不使用任何代码或示例的情况下最多用两句话定义多态性。我不想听到“所以你有一个人/汽车/开罐器......”或者这个词是如何派生的(没有人对你知道 poly 和 morph 的含义印象深刻)。如果您非常了解什么是多态性并且对英语有很好的掌握,那么您应该能够用简短但密集的定义来回答这个问题。如果您的定义准确地定义了多态性,但过于密集以至于需要进行几次阅读,那么这正是我正在寻找的。

为什么只有两句话?因为定义简短而明智。解释很长,包含示例和代码。在此处查找解释(这些页面上的答案对我的问题不满意):

多态性 vs 覆盖 vs 重载
尝试尽可能简单地描述多态性

我为什么要问这个问题?因为我被问到同样的问题,我发现我无法给出一个令人满意的定义(按照我的标准,这是相当高的)。我想看看这个网站上是否有任何伟大的头脑可以做到这一点。

如果你真的不能做到两句话的要求(这是一个很难定义的主题),那么你再过去就可以了。这个想法是有一个定义,它实际上定义了多态性是什么,而不是解释它的作用或如何使用它(得到区别?)。

4

31 回答 31

107

多态性允许表达某种契约,可能有许多类型以不同的方式实现该契约(无论是否通过类继承),每种方式都根据自己的目的。使用该合约的代码不应该(*)关心涉及哪个实现,只需要遵守合约即可。

(*) 无论如何,在理想情况下——显然调用代码经常非常慎重地选择适当的实现!

于 2009-01-03T22:13:04.027 回答
74

一般来说,水果是可以吃的,但不同种类的水果吃法不同。一个苹果,它是一种水果,可以吃(因为它是一种水果)。香蕉也可以吃(因为它也是一种水果),但方式与苹果不同。你先剥皮。

好吧,至少我知道,但我在某些方面很奇怪,所以我知道什么。

这说明了继承(水果可以吃)、多态性(吃水果的东西可以吃所有类型的水果)和封装(香蕉有皮)。

说真的,对象继承、多态、封装、虚拟事物、抽象事物、私有事物、公共事物,这些都是硬概念。如果有人绝对想要对此有 2 个句子的定义,那么请将该问题标记为代码高尔夫变体,因为两个这样的句子必须非常简洁,除非您知道它已经是什么,否则您将不会学到足够的知识它知道您需要了解更多信息。

于 2009-01-03T22:10:29.070 回答
48

多态性声明了一个不识别类型的统一接口,将实现细节留给实现该接口的具体类型。

于 2009-01-03T22:12:37.880 回答
21

Wikipedia:多态性是一种编程语言功能,允许使用统一接口处理不同数据类型的值。对我来说很简单。

于 2009-01-03T22:12:47.787 回答
21

实际上,多态的形式有很多种,也有不少争议。您甚至可能会看到无法正确定义它的 CS 教授。我知道三种类型:

  • ad-hoc 多态性(看起来像鸭子,走路像鸭子 => 是鸭子)。例如,可以在 Haskell 和 Python 中看到。

  • 泛型多态性(其中类型是某个泛型类型的实例)。例如可以在 C++ 中看到(int 的向量和字符串的向量都具有成员函数大小)。

  • 子类型多态性(一种类型继承自另一种类型)。在大多数 OO 编程语言中都可以看到(即三角形是一个形状)。

于 2009-01-03T22:53:30.810 回答
16

我真的明白,你为什么要问这个问题。我了解多态性,但我在面试时被要求对多态性给出简短而清晰的定义。因为我无法给出清晰而简短的定义,所以我开始考虑它,这是我的定义:

一种类型的对象具有一个相同的接口,但该接口的实现不同的能力。

于 2009-07-05T21:41:03.310 回答
12

定义

多态性是一个 1 美元想法的 10 美元词——当我要求做某事时,只要最终结果合适,我不在乎它是如何实现的。只要服务提供正确,我关心实施

讨论

虽然它通常用于软件开发,特别是在遵循面向对象原则开发的系统中,但多态性从根本上说是现实世界的原则,应该用现实世界的术语而不是技术术语来定义。

例子

当我想打电话时,我拿起电话,拨一个号码并与另一端的一方通话。我不关心电话是谁制造的,它使用什么技术,是有线、无线、移动还是 VOIP,或者它是否在保修期内。

当我想打印文档时,我会打印它。我不关心实现语言、打印机品牌、连接方式、耗材选择或纸张质量。

于 2009-04-07T06:54:36.457 回答
10

同一接口的多个实现。

示例:许多型号的电话都实现了数字键盘接口。

于 2009-11-14T17:17:57.663 回答
8

多态是设计对象模型时使用的面向对象的策略,以帮助简化代码。多态性的核心是定义两个相似但不同的对象,然后将这两个对象视为相同的能力。

好吧,这很难……

于 2009-01-03T22:11:08.447 回答
7

我只是想添加我自己对多态性的解释:非常一般地,多态性是为不同类型的实体提供单个接口的行为。

这是相当通用的,但这是我能想到的唯一方法来包装我所知道的所有三种类型的多态性:ad hocparametricsubtype。我将在下面详细介绍,并按名称按字母顺序对多态类型进行排序。您感兴趣的最有可能是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

如果CatDog都是 的子类Animal,那么它们共享一个接口,但实际上是不同的类型

我在这里有点切题,但是(我认为)子类型多态是唯一允许覆盖的:重新定义由父类定义的方法的行为的行为。这经常与重载相混淆,正如我们之前所见,重载是一种多态性,实际上不需要子类化(实际上也不需要类)。

于 2014-01-14T11:29:46.577 回答
6

多态性 == 多个类 + 相同的方法签名 + 特定于类的行为。

于 2009-01-07T15:11:55.153 回答
6

似乎这里提供了最好的定义,所以让我加两分钱,只是为了其他观察者。我希望它可以帮助更多。

多态性有两种:

1. Compile-time (static) polymorphism or (ad hoc) polymorphism.

那就是方法重载和运算符重载

2.  Run time or (dynamic) polymorphism.

第一个术语继承自 Java 和 C++ 术语。

但在.NET术语中,只有第二个我的意思是运行时多态性)真正被认为是多态性并简称为多态性

据我所知,有三种方法可以实现(运行时多态性

 1. Parametric polymorphism or simply the use of generics (templates in C++).

 2. Inheritance-based polymorphism or subtyping.

 3. Interface-based polymorphism.

基于接口的多态性的一个简单示例:

interface Imobile
{
    void Move();
}

class Person :Imobile
{
    public void Move() { Console.WriteLine("I am a person and am moving in my way."); }
}

class Bird :Imobile
{
    public void Move() { Console.WriteLine("I am a bird and am moving in my way."); }
}

class Car :Imobile
{
    public void Move() { Console.WriteLine("I am a car and am moving in my way."); }
}


class Program
{

    static void Main(string[] args)
    {
        // Preparing a list of objects
        List<Imobile> mobileList = new List<Imobile>();

        mobileList.Add(new Person());
        mobileList.Add(new Bird());
        mobileList.Add(new Car());

        foreach (Imobile mobile in mobileList)
        {
            mobile.Move();
        }

        // Keep the console open
        Console.WriteLine("Press any key to exit the program:");
        Console.ReadKey();
    }
}

输出:

 I am a person and am moving in my way.
 I am a bird and am moving in my way.
 I am a car and am moving in my way.
 Press any key to exit the program:
于 2014-10-21T00:03:14.227 回答
5

多态性是一种软件编码抽象,其中几个不同的底层实体(通常是数据,但总是不存在)都共享一个公共接口,允许它们在运行时看起来和行为相同。我们将其用作一种开发技术,以在大量相似但不相同的实例上强制执行一致的行为,并实现绝对最小化,从而减少对错误和不一致的预期。

保罗。

于 2009-01-03T23:50:39.960 回答
2

单个对象的多种形式称为多态。

于 2009-01-03T22:44:35.570 回答
2

多态性

不同的对象可以以不同的方式响应同一消息,使对象能够在不知道其确切类型的情况下相互交互。

通过: http ://www.agiledata.org/essays/objectOrientation101.html

于 2009-01-04T22:12:48.317 回答
2

多态性是对象在同一调用中出现和表现不同的能力。例如:每只动物的外观和声音都不同(当你击中它时:))

于 2012-03-07T20:02:43.307 回答
2

多态性是编程语言的一个特性,它允许将对象视为其超类型的实例。

于 2013-01-07T09:16:44.777 回答
1

为不同类型上的一组类似操作赋予一个名称。如果做得好,类比是显而易见的,例如通过算术“添加”数字和通过连接(将它们的长度相加)“添加”字符串。

于 2009-01-03T22:39:05.440 回答
1

这是我一直遵循的定义:

如果两个对象以相同的语义响应相同的消息,则它们之间是多态的(相对于特定协议)。

多态性是关于消息的,是关于能够以相同的语义响应同一组消息。

如果两个对象可以响应空?但是消息的语义不同,那么..它们不是多态的。

于 2010-01-08T14:19:50.110 回答
1

较低级别的多态性是从接口实例调用接口实现者定义的方法的能力。

于 2010-01-08T14:33:24.510 回答
1

多态性是一种编程特性,它允许对象具有多种类型(“形状”),并允许您根据需要执行的操作将其视为任何类型,而无需了解或关心它的其他类型。

于 2010-01-08T15:45:35.737 回答
1

多态性是一种语言功能,允许高级算法代码对多种类型的数据进行不变的操作。 还有一句话,不管它是为了…… ;-P。

(C++ 支持的类型在我的回答中列出并进行了对比:C++ 中的多态性

于 2011-06-16T06:14:25.330 回答
0

相同类型的实体(即实现相同的接口或从相同的类派生)以不同的方式(在相同的方法名称下)表现。

于 2013-02-14T21:07:14.413 回答
0

多态性概念最近成为一种现象。这是实际的漂移。运行时定义应该由超类的引用调用哪个子方法。现在,在实践中意味着什么?它实际上没有任何意义。您可以在没有多态性的情况下简单地编写代码。所以为什么?因为,如果我们没有多态性,我们必须记住所有子类函数的定义。多态性在实践中使我们免于这种情况。

您可以按如下方式定义列表:

List list = new List();

但如果您检查IList,您可以从界面中受益:

IList list = new List();

IList并自由使用参考。假设IList也在另一个类中实现,您可以通过再次IList引用使用该未知类的方法,而无需尝试记住该类名。很奇妙,不是吗?

现在,更多有价值的信息来了:
Java 默认是多态的,而 .NET 和 C++ 不是,在 MS 中,您必须声明基本函数virtual(并且在 .NEToverride关键字中)。

此外,多态性中有两条积分规则。一种是继承(通过接口实现或通过类扩展),另一种是覆盖。没有覆盖,多态性就不存在。请注意,方法重载(始终在单个类中)也是一种“简约”多态性。

于 2013-03-03T03:22:05.937 回答
0

我认为在不同的类中实现相同签名的方法(使用扩展或实现具有某种继承关系)是方法覆盖和多态性,因为通过这种方式我们实现了相同方法签名的多种形式。

于 2013-03-11T10:55:12.410 回答
0

对于给定的方法签名,为不同的、分层相关的类运行不同的方法实现。

于 2014-04-18T16:50:13.290 回答
0

多态性是使用不同的类以一种通用的方式实现一个公共接口(或扩展一个公共基类)的能力,而不需要现在具体的实现,并且只使用公共接口中可用的方法。

即:在Java中,由于ArrayList和LinkedList都实现了List,如果你将一个变量声明为List,你总是可以执行List中允许的操作,无论你的变量是实例化为ArrayList还是LinkedList。

于 2014-09-16T19:53:21.650 回答
-2

我想有时对象是动态调用的。您不确定对象是否是经典形状多边形中的三角形、正方形等。例子。

因此,为了抛开所有这些事情,我们只需调用派生类的函数并假设将调用动态类中的一个。

你不会在乎它是正方形、三角形还是矩形。你只关心这个地区。因此将根据传递的动态对象调用 getArea 方法。

于 2010-01-17T05:48:10.617 回答
-2

多态性是函数自动适应接受不同数据类型的输入数据的能力。您可以“添加”两个双打“1.1”和“2.2”并获得“3.3”或“添加”两个字符串“Stack”和“Overflow”并获得“StackOverflow”。

于 2015-08-21T16:51:55.763 回答
-3

多态性是指不同的对象以不同的方式响应相同的方法。例如,汽车在路上行驶,而人在路上行走。这是两个对象以不同的方式响应同一条道路。

于 2013-05-02T09:48:26.557 回答
-5

执行不同方法的单个类称为多态性。

于 2009-04-07T06:20:03.903 回答