多态与抽象:多态是实现抽象的方法之一吗?

Polymorphism vs Abstraction : Is polymorphism one of the way to achieve Abstraction?

我对多态的理解是,它是实现抽象的一种方式?每个人都同意我的观点吗?或者我的想法有什么缺陷?

多态

这是一种以更有效的方式处理反应不同的对象的能力。不同的对象反应不同,但共享相同的方法。这些方法位于一个通用接口中。

例如,如果我们与不同类型的鸭子一起工作,我们可以说它们都有共同点,只是做事的方式略有不同。

Duck[] ducks = new Duck[3];

    ducks[0] = new MallardDuck();
    ducks[1] = new RedheadDuck();
    ducks[2] = new RubberDuck();

    for(int i=0; i < ducks.length; i++) {
        System.out.println("Duck #" + (i + 1) + ":\n---------------------");
        ducks[i].quack();
        ducks[i].display();
        System.out.println(ducks[i].toString() + Driver.BLANK_LINE);
    }

OUTPUT:

Duck #1:
---------------------
Quack
Drawing a Mallard Duck to screen
MallardDuck@15db9742

Duck #2:
---------------------
Quack
Drawing a Red Headed Duck to screen
RedheadDuck@6d06d69c

Duck #3:
---------------------
Squeak!
Drawing a Rubber Duck to screen
RubberDuck@7852e922

围绕鸭子类型使用接口 "Duck",允许程序员调用 for 循环,在循环中他们可以调用 "Duck" 接口中包含的任何方法。

抽象

现在您可能认为抽象和多态性相似的地方可能是您构建界面的情况。以"Duck"接口为例:

    public interface Duck {

    public abstract void display();

    public abstract void performQuack();


}

你可以看到它已经非常抽象了。真正的接口不提供任何指令。它只是创建了一组通用方法,这些方法需要在每个实现它的 class 中。通过这种方式,您可以拥有许多相似的东西,它们的反应不同,遵循一组通用的 "abstract" 通用方法。

可以用一种不那么抽象的方式来控制你的鸭子。您可以将其设置为 "abstract class",而不是将其设置为 "interface"。

    public abstract class Duck {

    public abstract void display();

    public abstract void performQuack();

        public void swim() {
        System.out.println("All ducks float, even decoys!");
    }

}

在此class中添加了"swim"方法。此方法包含静态反应。 "swim" class 是脊状的。它可以被覆盖,但是none 更少,它甚至比不上其他方法在这个class 中的抽象程度。

为什么会死板?显而易见的答案是输出的字符串。仔细观察,它输出(到控制台)的方式使它更加严格。

如果您的程序不支持控制台怎么办?

这就是为什么抽象很重要。

结论

在某种程度上,您是在正确的轨道上。您不需要抽象来实现多态性。然而,你的好奇心是正确的。没有抽象,就没有必要使对象多态。如果每个对象都做完全相同的事情,那么这些对象就不需要分开。它们只需要是同一对象的不同实例。

我希望这有助于阐明多态和抽象之间的区别。