我知道什么是多态,但却无法清楚地理解它.我的代码如下:
class Human
{
public virtual void CleanTheRoom()
{
}
}
class Woman:Human
{
public override void CleanTheRoom()
{
//women clean faster
}
}
class Man:Human
{
public override void CleanTheRoom()
{
//men clean slower, different code here
}
}
class Child:Human
{
public override void CleanTheRoom()
{
//empty ... children are lazy :)
}
}
Run Code Online (Sandbox Code Playgroud)
我应该解释这是多态的,因为基类Human中的所有派生类都包含方法CleanTheRoom但是它们中的每一个都以不同的方式实现?
wsa*_*lle 21
当你想CleanTheRoom()在某种类型的方法上调用方法时,多态性的好处就出现了Human,但是你并不关心具体的方法.
具有CleanTheRoom()在基类级别定义,Human你可以在你的应用程序的其他地方写短的,更干净的代码,只要你用的实例工作Human,无论是Man,Woman或Child.
例如,多态性允许您避免丑陋的条件语句,您可以显式检查每种类型Human并调用不同的方法:
好:
private void SomeMethod(Human h)
{
//some logic
h.CleanTheRoom();
//more logic
}
Run Code Online (Sandbox Code Playgroud)
坏:
private void SomeMethod(Human h)
{
//some logic
if (h is Man)
CleanRoomSlowly();
else if (h is Woman)
CleanRoomQuickly();
else if (h is Child)
GoofOff();
//some logic
}
Run Code Online (Sandbox Code Playgroud)
Jac*_*son 16
你拥有的是一个很好的继承的例子.多态性特指能够通过使用单一类型(父类或接口)来引用不同类型的对象,这种类型的继承使得这种对象成为可能.像这样:
List<Human> humans = new ArrayList<Human>();
humans.add(new Woman());
humans.add(new Woman());
humans.add(new Man());
humans.add(new Child());
humans.add(new Child());
foreach(Human hum in humans) {
hum.CleanTheRoom(); //I don't know the type of hum, but I don't care
}
Run Code Online (Sandbox Code Playgroud)
说我一直在从不同的地方收集人类的实例 - 我不知道每个人的类型.但是我仍然可以迭代它们并调用CleanTheRoom(),因为它们共享一个父类.
我将添加一个真实世界的例子.假设我有一个Invoice针对不同类型的发票的各种子类的类 - Invoice对于服务客户和可能一次性购买的客户,可能有不同类型的s.有时候我非常关心这些差异,而我只处理一种类型.但有时我想循环查看本月的所有发票并打印出来.如果父类有一个print()方法(可能由不同类型实现不同),那么我可以这样做.