为不同的子类重写相同的函数是多态?

时间:2012-04-03 11:37:18

标签: polymorphism override

我在某处读到,覆盖是获得多态性的手段。多态性是指对象根据其类型改变行为的能力。

现在我可以说,当不同的子类覆盖父类的成员时,它会给我多态吗?

另外

class A
{
public void hello()
{
printf("in A");
}
}

class B extends A
{
public void hello()
{
printf("in B");
}
}

class C extends A
{
public void hello()
{
printf("in C);
}
}

现在,如果我做

B b=new B();
C c=new C();
A a1=b;
A a2=c;
a1.hello();
a2.hello();

现在将a1使用从A继承的b的所有成员,因此打印in B;和a2类似?

3 个答案:

答案 0 :(得分:1)

  

我在某处读到,压倒是你得到的手段   多态性。

覆盖并不意味着多态性。如果你覆盖或不覆盖它可以是多态。 多态性的良好定义可以在这里找到:Polymorphism - Define In Just Two Sentences

  

多态性是物体变化的能力   基于其类型的行为。

没必要。例如Animal类已经实现了Eat方法(通过Mouth),这个类可以说很多子类。除非他们不吃嘴,否则子类都不需要覆盖此方法。所以子类没有实现Eat方法,仍然可以找到Dog Animal的多态性。

  

现在我可以说当不同的子类覆盖成员时   一个父类,然后它给我多态?

你可以这么说,但只是再次告诉你,没有压倒我们也会得到多态性。

 YOUR CODE

你可以自己试试。

答案 1 :(得分:0)

通过继承,一个类可以用作多个类型;它可以用作自己的类型,任何基类型,或任何接口类型,如果它实现接口 多态性不仅对派生类很重要,对基类也很重要。事实上,任何使用基类的人都可以使用已经转换为基类类型的派生类的对象。

换句话说,每次使用基类时你都会有多态,你可以有“不同”的行为。重写只是一种多态的方法,但是考虑一下你不会覆盖任何方法的接口但是你仍然可以有多态(以不同的方式实现接口)

答案 2 :(得分:0)

多态性通常忽略每个类实例的特定(或派生)知识,并在基类指针(或引用)的集合上操作,让动态调度自动调用特定的重写派生函数。

经典示例是Shape基类,它定义了一个接口(例如,其中一个函数可以是.area()),我们从中导出了SquareCircle这两个类都将实现自己的Shape接口版本(例如,每个版本可能会选择自己的.area()计算)。如果我们有一个Shape对象的集合,我们可以对它们进行操作而不必担心具体的细节:

area = 0
for shape in shapes:
    area += shape.area()  # dispatches to specific shape's area() function