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



我在某处读到,重写是获得多态性的方法。多态性是指对象根据其类型改变行为的能力。

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

还有

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的所有成员,并因此打印CCD_ 1;类似地,对于a2?

我在某个地方读到,压倒一切是你获得多态性。

重写并不意味着多态性。如果覆盖或不覆盖,它可能是多态性。多态性的良好定义可以在这里找到:多态性-仅用两句话定义

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

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

现在我可以说,当不同的子类覆盖成员时那么它给了我多态性?

你可以说,但只是再次告诉你,在不覆盖的情况下,我们也得到了多态性。

 YOUR CODE

你可以自己试试。

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

换句话说,你有多态性,每次使用基类,你都可以有"不同"的行为重写只是一种具有多态性的方法,但考虑到接口,您没有重写任何方法,但仍然可以具有多态性(以不同的方式实现接口)

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

经典的例子是Shape基类,它定义了一个接口(例如,其中一个函数可以是.area()),其中我们有SquareCircle派生类,它们都将实现Shape接口的各自版本(例如,每个都可以选择具有自己的.area()计算)。如果我们有一个形状对象的集合,我们可以在不涉及特定细节的情况下对它们进行操作:

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

最新更新