多态 – 只定义两个句子
我已经看了其他的定义和解释,没有一个能让我满意。 我想看看是否有人可以用最多两个句子来定义多态,而不需要使用任何代码或例子。 我不想听到'所以你有一个人/汽车/开jar器'或这个词是如何派生的(没有人印象深刻,你知道什么聚和变体的意思)。 如果你对多态现象有很好的把握,并且掌握了很好的英语水平,那么你应该能够用一个简短而密集的定义来回答这个问题。 如果你的定义准确地定义了多态性,但是如此密集以至于需要几次读取,那么这就是我正在寻找的东西。
为什么只有两句话? 因为一个定义是短而智能的。 解释很长,包含示例和代码。 在这里寻找解释(这些网页上的答案不满意我的问题):
多态vs覆盖vs重载
尝试尽可能简单地描述多态性
我为什么问这个问题? 因为我被问到同样的问题,我发现我无法提出一个令人满意的定义(按照我的标准,这很高)。 我想看看这个网站的任何伟大的想法是否可以做到这一点。
如果你真的不能做出这两个句子的要求(这是一个很难定义的主题),那么如果你过去了,这是很好的。 这个想法是有一个定义,实际上定义什么多态性是什么,并不解释它做什么或如何使用它(得到的差异?)。
多态性允许expression某种契约,可能有许多types以不同的方式实现契约(不pipe是通过类inheritance还是不依赖于它们自己的目的)。 使用该合同的代码不应该(*)必须关心涉及哪个实现,只有合约才会被遵守。
(*)无论如何,在理想的情况下 – 显然很多时候调用代码已经非常慎重地select了适当的实现!
一般来说,水果是可以吃的,但不同种类的水果是以不同的方式吃的。 可以吃一个水果苹果(因为它是一种水果)。 香蕉也可以吃(因为它也是一种水果),但方式与苹果不同。 你先剥皮。
那么,至less我是这样做的,但是我很奇怪,所以我知道些什么。
这说明inheritance(水果可以被吃掉),多态性(吃水果的东西可以吃所有types的水果)和包封(一个香蕉有皮)。
然而,严肃地说,对象inheritance,多态,封装,虚拟事物,抽象事物,私人事物,公共事物,这些都是硬性概念。 如果有人完全希望对此有两个句子的定义,那么请将问题标记为代码高尔夫变体,因为两个这样的句子必须非常简洁,除非你知道已经有什么东西,否则你不会学到足够的东西它知道你需要了解更多。
多态是声明一个统一的接口,它不是types感知的,将实现细节留给实现接口的具体types。
实际上,有多种forms的多态,对此有相当的争议。 你甚至可能会看到CS教授无法正确定义它。 我知道三种types:
-
ad-hoc多态性(看起来像一只鸭子,像一只鸭子走路=>是一只鸭子)。 例如,可以在Haskell和Python中看到。
-
generics多态(其中一个types是某种genericstypes的一个实例)。 例如在C ++中可以看到(int的向量和string的向量都有成员函数的大小)。
-
子types多态(其中一个types从另一个typesinheritance)。 在大多数OO编程语言中都可以看到(例如三angular形是一种形状)。
Wikipedia:多态是一种编程语言function,允许使用统一的接口处理不同数据types的值。 对我来说很简单。
我真的明白,为什么你问这个问题。 我了解多态性,但是我在面试时被要求给出多态性的简短明确的定义。 因为我不能给出清晰而简短的定义,所以我开始思考这个问题,这里是我的定义:
一种types的对象具有一个相同的接口的能力,但是这个接口的不同实现。
定义 :
对于1美元的想法,多形性是一个10美元的单词 – 当我要求做某件事时,只要最终的结果是合适的,我不关心它是如何实现的。 只要提供的服务是正确的,我不关心 实施 。
讨论
虽然它常用于软件开发,尤其是在面向对象的原则下开发的系统中,多态性从根本上说是一个现实世界的原则,应该用现实世界的术语来定义,而不是技术的。
例子
当我想打个电话的时候,我拿起一个电话,拨打一个电话号码,然后和对方的另一方通话。 我不关心谁制造了手机,使用了什么技术,无论是有线,无线,移动还是VOIP,还是在保修期内。
当我想打印一个文件,我打印它。 我不关心打印机的实施语言,打印机品牌,连接方式,耗材select或纸张质量。
同一接口的多个实现。
示例:许多型号的电话实现数字小键盘界面。
在devise对象模型时,多态是一种面向对象的策略,有助于简化代码。 在它的核心多态性是能够定义两个simil但不同的对象,然后对待这两个对象,如果他们是相同的。
好的,这很难….
多态性是一种软件编码抽象,其中几个不同的底层实体(通常是数据,但总是nit)共享一个共同的接口,允许他们在运行时看起来和行为相同。 我们将此作为一种开发技术,通过绝对最小的实现来执行广泛的类似但不相同的实例的一致行为,从而减less对错误和不一致的期望。
保罗。
多态性==多个类+相同的方法签名+类特定的行为。
我只是想我会join我自己的解释什么多态性是:一般来说,多态性是为不同types的实体提供单一接口的行为。
这是相当通用的,但这是我能想到包装我所知道的所有三种types多态性的唯一方式: 临时 , 参数和子types 。 我将在下面详细介绍,按字母顺序按名称排列多态性types。 你感兴趣的是最可能的亚型多态性 ,这是最后一个。
特别的多态性
临时多态是为不同参数types提供同一方法的多个实现的行为。 在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
方法共享一个接口 ,但他们工作在不同types的实体上。
参数多态性
参数多态是指让一个类(或方法)在一个本身是类(或方法)参数的types上工作的行为。 它通常被称为generics 。
例如,Java的List[T]
在实例化时需要一个参数T
,而这个参数定义了结果对象的types。
纯粹主义者注意到,我有意无视原始types,因为我觉得他们只是在这种情况下浑水。
List[String]
和List[Date]
共享一个接口 ,但工作(而且)是不同的types 。
亚型多态性
子types多态可能是你最初在你的问题中的意思:这是为同一types的多个实现提供单一接口的行为。
使用习惯的例子: Animal
提供了一个所有实现必须遵守的合约。 Dog
是一种Animal
,因此支持Animal
声明的所有操作。 根据Liskovreplace原则 ,这允许你使用一个Dog
的实例,其中Animal
一个实例是预期的(但不是相反的方向)。
如果Dog
都是Animal
子类,那么他们共享一个界面,但实际上是不同的types 。
我在这里有一点切线,但是亚型多态性是(我认为)唯一允许覆盖的 :重新定义由父类定义的方法的行为。 这经常与重载相混淆,正如我们以前所见,它是一种多态,实际上并不需要子类化(也不需要类)。
看起来这里提供了最好的定义,所以请让我加两分钱给其他观察者。 我希望它可以帮助更多。
有两种多态性:
1. Compile-time (static) polymorphism or (ad hoc) polymorphism.
这只是方法重载和运算符重载
2. Run time or (dynamic) polymorphism.
第一个术语是从Java和C ++术语inheritance而来的。
但在.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:
单个对象的多种forms被称为多态性。
多态性是一个对象在同一个调用中出现和行为不同的能力。 例如:每只动物出现并听起来不一样(当你碰到它:))
多态是编程语言的一个特性,它允许一个对象被视为其超types的一个实例。
为不同types的一组类似操作提供一个名称。 如果做得好,类比是显而易见的,例如在算术上“添加”数字和通过串联(它们的长度相加)“添加”string。
多态性
不同的对象可以以不同的方式响应相同的消息,使对象能够彼此交互而不知道它们的确切types。
通过: http : //www.agiledata.org/essays/objectOrientation101.html
这是我一直遵循的定义:
两个对象在它们之间是多态的(相对于特定的协议),如果两个对象以相同的语义对相同的消息进行响应。
多态性是关于消息,是关于能够用相同的语义来响应同一组消息。
如果两个对象CAN响应空? 但是消息的语义是不同的,那么它们不是多态的。
较低级别的多态性是能够从接口实例调用由接口的实现者定义的方法。
多态性是一种编程function,它允许一个对象具有多种types('形状'),并且可以根据您需要做的事情将其视为任何types,而无需了解或关心其他types。
多态性是语言function,允许高级algorithm代码在多种types的数据上保持不变。 而另一个句子,无论是… …; – P。
(C ++支持types在我的答案中列出和对比: c ++中的多态性 )
多态概念最近成为一种现象。 这是实际的漂移。 运行时定义应该由超类的引用调用哪个子方法。 现在,在实践中意味着什么? 这意味着什么都没有。 你可以简单的编码而不用多态。 所以为什么? 因为如果我们没有得到多态性,我们不得不记住所有的子类函数定义。 在实践中,多态性使我们免于此。
你可以定义一个列表如下:
List list = new List();
但如果你检查IList
,你可以从界面中获益:
IList list = new List();
并自由使用IList
参考。 假设IList
也是在另一个类中实现的,可以通过再次使用IList
引用来使用那个未知类的方法,而不要试图记住类名。 奇妙,不是吗?
现在,更有价值的信息即将到来:
Java默认是多态的,而.NET和C ++不是,在MS中,您必须声明基本函数virtual
(以及.NET override
关键字)。
另外,在多态中有2个整体规则。 一个是inheritance(通过接口impl或通过类扩展),另一个是重写。 不重写,多态不存在。 请注意,方法重载(总是在一个类中)也是一种“简约”多态。
对于给定的方法签名,不同的方法实现针对不同的层次相关的类运行。
多态性是使用不同类实现通用接口(或扩展公共基类)的能力,而不需要现在的具体实现,只使用通用接口中可用的方法。
即:在Java中,因为ArrayList和LinkedList都实现了List,所以如果将一个variables声明为List,那么无论您将variables实例化为ArrayList还是LinkedList,都可以始终执行List中允许的操作。
相同types的实体(即,实现相同的接口或从相同的类派生而来)以不同的方式(在相同的方法名下)运行。
我认为在不同的类中实现相同的签名方法(使用扩展或实现具有某种inheritance关系)是方法重写,也是多态,因为这样我们实现了许多相同方法签名的forms。
多态性是函数自动适应接受不同数据types的input数据的能力。 你可以'添加'两个双打“1.1”和“2.2”,并获得“3.3”或“添加”两个string“堆栈”和“溢出”,并获得“堆栈溢出”。
我猜有时dynamic调用对象。 你不确定这个物体是否是一个三angular形,正方形等等。 例。
所以,为了留下所有这些东西,我们只需调用派生类的函数,并假设将调用一个dynamic类。
你不会在乎,如果它是一个方形,三angular形或矩形。 你只关心该地区。 因此getArea方法将根据传递的dynamic对象被调用。
多态性是指不同的对象以不同的方式响应相同的方法。 例如,当一个人在路上行走时,汽车在路上移动。 那些是以不同的方式回应同一条道路的两个物体。