使用运行时多态性
本文关键字:多态性 运行时 | 更新日期: 2023-09-27 18:19:04
我是一个编程新手,我想问一下运行时多态性的最终用途是什么?
的例子:
class Parent
{
//do something
}
class Child : Parent
{
//do something
}
main()
{
Parent p = new Child (); // run-time polymorphism
Child q = new Child(); // no polymorphism
}
我的问题是,我们使用第一行(Parent p = new Child();
)来实现运行时多态性,但我们可以使用第二行(Child q = new Child();
)代替第一行....
那么它们之间的区别是什么呢?为什么要使用运行时多态性?
虽然你的例子显示了为什么这是一个糟糕的例子,但想象一下这样的情况:
main()
{
Parent p = Factory("SomeCondition"); ///run-time polymorphism
}
Parent Factory(string condition)
{
if (condition == "SomeCondition")
{
return new Child();
}
else
{
return new Parent();
}
}
当工厂被调用时,我们不知道实际返回类型是什么,它可能是子类型,也可能是父类型
您提供的代码片段没有实际用途。但是想想这个方法:
public void DoSomething( Parent parent ){ ... }
你可以这样做:
Child child = new Child();
DoSomething( child );
在这种情况下,DoSomething将只是一个Parent。它不关心它是否是一个子类。
希望能有所帮助。
运行时多态性的最终用途是泛化。它通过允许使用公共超类的子类来促进代码重用。您不希望为来自不同类的每个对象编写单独的方法,那样会很繁琐。
运行时多态性允许您编写可被许多不同子类使用的通用代码。
一个更好的简单示例是这样的:每只动物可能吃不同的食物,有不同的喂养逻辑,但你抽象出"如何",只关心方法遵循预期的规则。
我个人认为接口是看到多态性有用性的好方法。查一下。
class Pet
class Cat : Pet
class Persian : Cat
class Dog : Pet
class Chiwawa : Dog
main{
Pet myPet = new Persian();
if(myPet.IsHungry())
myPet.feed();
myPet = new Chiwawa()
if(myPet.IsHungry())
myPet.Feed()
}
它的主要用途不是用于实例化,正如您所展示的,它是用于使用一组代码处理从公共祖先继承的所有对象。
这种用法的例子包括将对象作为参数传递给方法,或者遍历不同类型的对象集合并对所有对象执行相同的操作。