如何以易于理解的方式描述多态?
我们可以在Internet和书籍上找到关于该主题的大量信息,例如Type polymorphism.但是,让我们尽可能地让它变得简单.
两个对象以不同的行为响应同一个消息; 发件人不必在意.
带有简单弹出盖的每个罐子都以同样的方式打开.
作为一个人,你知道你可以打开()任何你能找到的.
打开时,并非所有罐头的行为都相同.
有些含有坚果,有些含有假蛇.
结果取决于罐的类型,如果罐是"CanOfNuts"或"CanOfSnakes",但这与你如何打开它无关.你只知道你可以打开任何Can,并且会得到某种结果,这些结果是根据你打开的Can的类型决定的.
pUnlabledCan->打开(); //可能会给坚果,可能会给蛇.直到我们称之为止,我们才知道
Open()具有泛型返回类型"Contents"(或者我们可能决定没有返回类型),因此open始终具有相同的函数签名.
你,人,是用户/来电者.
Open()是虚拟/多态函数.
"Can"是抽象基类.
CanOfNuts和CanOfSnakes是"Can"类的多态子.
每个Can都可以被打开,但具体它是什么以及它返回的具体内容是由什么样的能量来定义的.
当你看到pUnlabledCan时你所知道的就是你可以Open()它,它将返回内容.任何其他行为(例如在你脸上弹出蛇)都是由特定的Can决定的.
这是我的答案来自一个类似的问题.这是伪C#/ Java中的多态性示例:
class Animal { abstract string MakeNoise (); } class Cat : Animal { string MakeNoise () { return "Meow"; } } class Dog : Animal { string MakeNoise () { return "Bark"; } } Main () { Animal animal = Zoo.GetAnimal (); Console.WriteLine (animal.MakeNoise ()); }
Main()方法不知道动物的类型,并且取决于MakeNoise()方法的特定实现的行为.
对多态性的最简单描述是它是一种减少if/switch语句的方法.
它还具有允许您扩展if/switch语句(或其他人的语句)而无需修改现有类的好处.
例如,考虑Stream
.NET中的类.没有多态性,它将是一个单独的大型类,其中每个方法实现一个如下的switch语句:
public class Stream { public int Read(byte[] buffer, int offset, int count) { if (this.mode == "file") { // behave like a file stream } else if (this.mode == "network") { // behave like a network stream } else // etc. } }
相反,我们允许运行时以更有效的方式为我们进行切换,方法是根据具体类型(FileStream
,NetworkStream
)自动选择实现,例如
public class FileStream : Stream { public override int Read(byte[] buffer, int offset, int count) { // behave like a file stream } } public class NetworkStream : Stream { public override int Read(byte[] buffer, int offset, int count) { // behave like a network stream } }
聚:许多
态射:形态/形状
演员与角色(或角色)
苹果和橘子都是水果.水果可以吃.因此,苹果和橘子都可以吃.
踢球者?你吃不同的东西!剥橙子,但不剥苹果.
所以实施方式不同,但最终结果是一样的,你吃水果.