使用运行时多态性

本文关键字:多态性 运行时 | 更新日期: 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()
}

它的主要用途不是用于实例化,正如您所展示的,它是用于使用一组代码处理从公共祖先继承的所有对象。

这种用法的例子包括将对象作为参数传递给方法,或者遍历不同类型的对象集合并对所有对象执行相同的操作。