多态性 - 仅用两个句子定义

时间:2009-01-03 22:06:40

标签: oop polymorphism terminology

我看过其他定义和解释,但没有一个能让我满意。我想知道是否有人可以在不使用任何代码或示例的情况下在最多两个句子中定义多态性。我不想听到'所以你有一个人/汽车/开罐器......'或者这个词是如何得出的(没有人会对你知道poly和morph意味着什么感到印象深刻)。如果你非常了解多态性是什么并且掌握了良好的英语能力,那么你应该能够在一个简短的,虽然密集的定义中回答这个问题。如果你的定义准确地定义了多态性,但它是如此密集以至于需要一些读取,那么这正是我正在寻找的。

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

Polymorphism vs Overriding vs Overloading
Try to describe polymorphism as easy as you can

为什么我问这个问题?因为我被问到同样的问题而且我发现我无法提出令人满意的定义(根据我的标准,这是非常高的)。我想知道这个网站上的任何一位伟大的人才能做到这一点。

如果你真的不能完成两句话的要求(这是一个难以定义的主题),那么如果你过去就没关系。我们的想法是有一个定义,它实际上定义了什么是多态,并没有解释它的作用或如何使用它(得到差异?)。

31 个答案:

答案 0 :(得分:100)

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

(*)在理想的情况下,无论如何 - 很明显,调用代码已经非常谨慎地选择了适当的实现!

答案 1 :(得分:67)

作为一般规则,水果可以食用,但不同类型的水果以不同的方式食用。苹果是一种水果,可以吃(因为它是一种水果)。香蕉也可以吃(因为它也是一种水果),但与苹果的方式不同。你先剥掉它。

好吧,至少我这样做,但我有些举止,所以我知道什么。

这说明了遗传(可以吃水果),多态性(吃水果可以吃掉各种水果的东西)和封装(香蕉有皮)。

严重的是,对象继承,多态,封装,虚拟事物,抽象事物,私事物,公共事物,这些都是难以理解的概念。如果有人绝对希望对此有2个句子的定义,那么请将问题标记为代码 - 高尔夫变体,因为两个这样的句子必须如此简洁,除非你知道它已经是什么,否则你将无法学到什么它知道您需要了解更多信息。

答案 2 :(得分:46)

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

答案 3 :(得分:21)

实际上,存在多种形式的多态性,并且存在相当多的争议;你甚至可能看到CS教授无法正确定义它。我知道有三种类型:

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

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

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

答案 4 :(得分:20)

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

答案 5 :(得分:14)

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

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

答案 6 :(得分:10)

同一界面的多个实现。

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

答案 7 :(得分:10)

<强>定义

对于1美元的想法,多态性是一个10美元的单词 - 当我要求完成某些事情时,只要最终结果合适,我就不在乎它是如何实现的。只要正确提供服务,我就不关心关于实现

讨论

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

实施例

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

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

答案 8 :(得分:6)

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

好的,这很难......

答案 9 :(得分:6)

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

这是相当通用的,但这是我能想到的唯一方法来包装我所知道的所有三种类型的多态性: ad hoc 参数子类型。我将在下面详细介绍,并按字母顺序按名称对多态类型进行排序。你感兴趣的那个很可能是子类型多态,这是最后一个。

Ad hoc多态性

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提供所有实现必须遵守的合同。 DogAnimal,因此支持Animal声明的所有操作。根据{{​​3}},这允许您使用Dog的实例,其中Animal的实例是预期的(但不是相反)。

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

我在这里有点切线,但是子类型多态性(我认为)是唯一一个允许覆盖:重新定义由a定义的方法的行为的行为父母班。这经常与重载混淆,正如我们之前看到的那样,它是一种多态,实际上并不需要子类化(也不需要类,真的)。

答案 10 :(得分:5)

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

答案 11 :(得分:5)

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

保罗。

答案 12 :(得分:5)

这里似乎提供了最好的定义,所以请让我添加two cents,仅供其他观察员使用。我希望它可以提供更多帮助。

有两种多态性:

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:

答案 13 :(得分:2)

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

答案 14 :(得分:2)

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

答案 15 :(得分:2)

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

答案 16 :(得分:1)

这是我一直遵循的定义:

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

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

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

答案 17 :(得分:1)

多态性是一种语言功能,允许高级算法代码在多种类型的数据上保持不变。另一句话,无论它是什么...... ;-P。

(在我的回答中列出并对比了C ++支持的类型:Polymorphism in c++

答案 18 :(得分:1)

多态性是一种编程功能,它允许对象具有多种类型(“形状”),并允许您根据您需要做的事情将其视为任何类型,而无需了解或关注其他类型。

答案 19 :(得分:1)

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

答案 20 :(得分:1)

<强>多态性

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

经: http://www.agiledata.org/essays/objectOrientation101.html

答案 21 :(得分:1)

为不同类型的一组类似操作提供单一名称。如果做得好,那么类比很明显,例如算术地“添加”数字并通过连接“添加”字符串(总结它们的长度)。

答案 22 :(得分:0)

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

答案 23 :(得分:0)

多态概念最近成为一种现象。这是实际漂移。运行时定义应该通过超类的引用调用哪个子方法。现在,在实践中意味着什么?实际上没什么意思。您可以简单地编码而无需多态。所以为什么?因为,如果我们没有获得多态性,我们必须记住所有子类函数定义。多态性在实践中使我们远离这一点。

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

List list = new List();

但如果您检查IList,则可以将界面视为:

IList list = new List();

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

现在,更多有价值的信息即将来临:
Java默认是多态的,而.NET和C ++则不是,在MS中,你必须声明基函数virtual(以及.NET override关键字)。

此外,多态性中有两个完整的规则。一个是继承(通过接口impl。或通过类扩展),另一个是重写。没有覆盖,多态性就不存在了。请注意,方法重载(总是在单个类中)也是一种“简约”多态。

答案 24 :(得分:0)

我认为在不同的类中实现相同签名的方法(使用extends或implements具有某种继承关系)是方法重写和多态,因为这样我们实现了相同方法签名的多种形式。 / p>

答案 25 :(得分:0)

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

答案 26 :(得分:0)

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

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

答案 27 :(得分:-2)

我猜有时会动态调用对象。您不确定对象在经典形状poly中是否为三角形,正方形等。例。

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

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

答案 28 :(得分:-2)

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

答案 29 :(得分:-3)

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

答案 30 :(得分:-5)

使用不同方法的单个类称为多态。