繁体   English   中英

使用运行时多态

[英]Use of run-time polymorphism

我是编程新手,请问运行时多态性的最终用途是什么?

例:

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来说,它只是父级。 不在乎它是否是子类。

希望能帮助到你。

运行时多态性的最终用途是泛化。 它通过允许使用公共超类的子类来促进代码重用。 您不想为来自不同类的每个对象编写单独的方法,这会很麻烦。

运行时多态性使您可以编写可被许多不同子类使用的通用代码。

一个更好的简单示例将是这样的。 每只动物可能会吃不同的食物,并且在喂养方式上有不同的逻辑,但是您要提取“方式”,并且只在乎该方法遵循期望的规则。

我个人认为接口是查看多​​态性有用性的好方法。 看看那些。

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()
}

正如您所显示的,此操作的主要用途不是实例化,而是用于使用单个代码集处理从一个共同祖先继承的所有对象。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM