使用运行时多态性

时间:2011-12-27 19:13:41

标签: c# 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();)代替第一行....

那么两者之间有什么区别?为什么我们使用运行时多态?

5 个答案:

答案 0 :(得分:5)

虽然你的例子说明了为什么这是一个糟糕的例子,但是如下图所示:

main()
{
    Parent p = Factory("SomeCondition"); ///run-time polymorphism
}

Parent Factory(string condition)
{
    if (condition == "SomeCondition")
    {
        return new Child();
    }
    else
    {
        return new Parent();
    }      
}

当工厂被调用时,我们不知道返回类型实际上是什么,它可能是一个孩子,它可能是一个父母。

答案 1 :(得分:4)

您提供的代码段没有实际用途。但想想这个方法:

public void DoSomething( Parent parent ){ ... }

你可以这样做:

Child child = new Child();
DoSomething( child );

在这种情况下,对于DoSomething,它将只是一个父母。它不关心它是否是一个子类。

希望它有所帮助。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

一个更好的简单例子就是这样的。每只动物可能会吃不同的食物,并且对如何喂食有不同的逻辑,但是你抽象出“如何”并且只关心该方法遵循预期的规则。

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

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

答案 4 :(得分:0)

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

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