Mor*_*man 59 language-agnostic oop polymorphism
如何以易于理解的方式描述多态?
我们可以在Internet和书籍上找到关于该主题的大量信息,例如Type polymorphism.但是,让我们尽可能地让它变得简单.
Dav*_*kel 32
带有简单弹出盖的每个罐子都以同样的方式打开.
作为一个人,你知道你可以打开()任何你能找到的.
打开时,并非所有罐头的行为都相同.
有些含有坚果,有些含有假蛇.
结果取决于罐的类型,如果罐是"CanOfNuts"或"CanOfSnakes",但这与你如何打开它无关.你只知道你可以打开任何Can,并且会得到某种结果,这些结果是根据你打开的Can的类型决定的.
pUnlabledCan->打开(); //可能会给坚果,可能会给蛇.直到我们称之为止,我们才知道
Open()具有泛型返回类型"Contents"(或者我们可能决定没有返回类型),因此open始终具有相同的函数签名.
你,人,是用户/来电者.
Open()是虚拟/多态函数.
"Can"是抽象基类.
CanOfNuts和CanOfSnakes是"Can"类的多态子.
每个Can都可以被打开,但具体它是什么以及它返回的具体内容是由什么样的能量来定义的.
当你看到pUnlabledCan时你所知道的就是你可以Open()它,它将返回内容.任何其他行为(例如在你脸上弹出蛇)都是由特定的Can决定的.
Mar*_*osi 31
这是我的答案来自一个类似的问题.这是伪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 ());
}
Run Code Online (Sandbox Code Playgroud)
Main()方法不知道动物的类型,并且取决于MakeNoise()方法的特定实现的行为.
Gre*_*ech 20
对多态性的最简单描述是它是一种减少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.
}
}
Run Code Online (Sandbox Code Playgroud)
相反,我们允许运行时以更有效的方式为我们进行切换,方法是根据具体类型(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
}
}
Run Code Online (Sandbox Code Playgroud)