当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《多态性-仅用两个句子定义》经验,为你挑选了13个好方法。

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

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

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

我为什么问这个问题?因为我被问到同样的问题而且我发现我无法得出令人满意的定义(根据我的标准,这是非常高的).我想看看这个网站上是否有任何伟大的思想能够做到这一点.

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



1> Jon Skeet..:

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

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


@Doug:如果没有合同,甚至通过文档或命名暗示,那么你怎么知道它会做你想要的呢?你在自己的答案中谈到一个"界面" - 这听起来很像我的合同 - 你认为差异是什么?"接口"和"合同"都是可以在"强"意义上使用的单词(例如在编译时强制执行)或非常松散地使用(例如通过命名约定和使用动态类型).
严格来说,没有要求"一种类型表达某种合同".所有真正需要的是多个实现可以响应相同的消息,而消息发送者不需要知道或关心哪个实现正在处理消息.
@Downvoter:关注评论?

2> angry person..:

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

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

这说明了遗传(水果可以吃),多态性(吃水果可以吃所有类型的水果)和包装(香蕉有皮).

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


铁杉也是一种水果!你可以吃它但只吃一次!
我收集到了,我只是发布了一些有点幽默(对我而言)答案:)多态性和OOP是那些大墙的东西之一,如果你绘制学习曲线,你只需要碰到一堵大墙,你要么爬过它或者你没有.如果你这样做,那么你通常会有一个很大的AHA!经验...

3> Eran Galperi..:

多态性声明了一个不是类型感知的统一接口,将实现细节留给实现接口的具体类型.



4> 小智..:

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

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

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

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


+1提及有不同类型的多态性.但是,您对ad-hoc多态的定义似乎与http://en.wikipedia.org/wiki/Type_polymorphism中提到的完全不同.该页面说有2种类型(ad-hoc与参数),而不是3种,并且还区分了多态函数和多态数据类型.据我所知,您的3种类型分别对应于参数多态函数,参数多态数据类型和ad-hoc多态函数.

5> Otávio Décio..:

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



6> Nikolay Tray..:

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

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



7> Bevan..:

定义:

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

讨论

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

例子

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

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


听起来像'封装'的例子对我来说

8> Doug Knesek..:

同一接口的多个实现.

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



9> JoshBerke..:

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

好吧那很难....



10> Nicolas Rina..:

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

这是相当通用的,但这是我能想到的唯一方法来包装我所知道的所有三种类型的多态性: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提供所有实现必须遵守的合同.Dog是一个Animal,因此支持所有Animal声明的操作.根据Liskov替换原则,这允许您使用期望Dog实例的实例Animal(但不是相反).

如果CatDog是两个子类Animal,那么它们共享一个单一的界面,但事实上是不同类型的.

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



11> Paul W Homer..:

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

保罗.



12> S.Lott..:

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



13> siamak..:

似乎这里提供了最好的定义,所以让我加上我的两分钱,仅供其他观察者使用.我希望它可以提供更多帮助.

有两种多态性:

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 mobileList = new List();

        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:

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有