多态性与抽象:多态性是否是实现抽象的方式之一?

时间:2017-11-25 07:38:21

标签: oop design-patterns software-design

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

1 个答案:

答案 0 :(得分:1)

<强>多态性

这是能够以更有效的方式处理不同反应的对象的能力。不同的对象反应不同,但共享相同的方法。这些方法可以在一个通用界面中找到。

例如,如果我们使用不同类型的鸭子,我们可以说它们都有共同的东西,但是以稍微不同的方式进行。

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

输出:

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

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

<强>抽象

现在您可能认为抽象和多态性相似可能就是您构建界面的情况。以#34; Duck&#34;接口例如:

    public interface Duck {

    public abstract void display();

    public abstract void performQuack();


}

你可以看到它和它一样抽象。真正的接口不提供任何指令。它只是创建了一组需要在每个实现它的类中的常用方法。通过这种方式,你可以有许多类似的东西,它们的反应不同,遵循一个共同的&#34;抽象&#34;一套常用方法。

有可能采用不那么抽象的方式来控制你的鸭子。您可以将其设置为&#34;抽象类&#34;而不是将其设置为&#34;接口&#34;。

    public abstract class Duck {

    public abstract void display();

    public abstract void performQuack();

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

}

在这堂课中#&#34;游泳&#34;方法被添加。该方法包含静态反应。 &#34;游泳&#34;上课是山脊。它可以被覆盖,但是,它甚至没有与其他方法在这个类中的抽象程度相比。

为什么它僵硬?显而易见的答案是输出的字符串。看起来更接近,它输出的方式(到控制台)使它更加僵化。

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

这就是抽象很重要的原因。

<强>结论

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

我希望这有助于澄清多态与抽象之间的区别。