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

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

多态、重写、重载
尝试尽可能简单地描述多态性

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

如果你确实达不到两句话的要求(这是一个很难定义的主题),那么你过去也没关系。这个想法是有一个定义,实际上定义了多态性是什么,但没有解释它的作用或如何使用它(明白其中的区别吗?)。

有帮助吗?

解决方案

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

(*) 无论如何,在理想情况下 - 显然调用代码通常非常有意地选择了适当的实现!

其他提示

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

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

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

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

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

实际上,多态性有多种形式,并且存在着不少争议。你甚至可能会看到计算机科学教授无法正确定义它。我知道三种类型:

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

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

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

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

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

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

定义:

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

讨论

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

例子

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

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

同一接口的多个实现。

例子:许多型号的电话均采用数字键盘接口。

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

好吧,这很难......

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

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

特设多态性

特设多态性 是为不同参数类型提供同一方法的多个实现的行为。在 面向对象编程, ,一般称为 方法重载. 。例如:

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 声明。根据 里氏替换原则, ,这允许您使用一个实例 Dog 其中一个实例 Animal 是预期的(但不是相反)。

如果 CatDog 都是子类 Animal, ,然后他们共享一个 单一接口 但事实上 不同种类.

我在这里有点离题,但子类型多态性是(我认为)唯一允许的 压倒性的: :重新定义父类定义的方法的行为。这经常与 超载 正如我们之前所看到的,它是一种多态性,实际上不需要子类化(实际上也不需要类)。

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

保罗.

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

看来这里提供了最好的定义,所以让我添加我的 两分钱 仅供其他观察者参考。我希望它可以帮助更多。

多态性有两种:

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

这就是简单的方法重载和运算符重载

2.  Run time or (dynamic) polymorphism.

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

但在 。网 术语仅 第二个 (我是说 运行时多态性)实际上被认为是多态性,简单地称为 多态性.

据我所知,有三种实现方法(运行) 多态性.

 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:

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

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

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

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

多态性

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

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

这是我一直遵循的定义:

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

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

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

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

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

多态性是一种语言功能,允许高级算法代码在多种类型的数据上运行不变。 还有另一句话,不管它是为了什么......;-P。

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

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

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

List list = new List();

但如果你检查 IList, ,您可以从该接口中受益:

IList list = new List();

并使用 IList 自由参考。假设 IList 也在另一个类中实现,您可以再次使用该未知类的方法 IList 参考而不试图记住该类名。太棒了,不是吗?

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

另外,多态性有两个完整的规则。一种是继承(通过接口实现)。或通过类扩展),另一个是压倒一切的。如果没有重写,多态性就不存在。请注意,方法重载(始终在单个类中)也是一种“简约”多态性。

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

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

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

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

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top