多态与抽象:多态是实现抽象的方法之一吗?
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 中的抽象程度。
为什么会死板?显而易见的答案是输出的字符串。仔细观察,它输出(到控制台)的方式使它更加严格。
如果您的程序不支持控制台怎么办?
这就是为什么抽象很重要。
结论
在某种程度上,您是在正确的轨道上。您不需要抽象来实现多态性。然而,你的好奇心是正确的。没有抽象,就没有必要使对象多态。如果每个对象都做完全相同的事情,那么这些对象就不需要分开。它们只需要是同一对象的不同实例。
我希望这有助于阐明多态和抽象之间的区别。
我对多态的理解是,它是实现抽象的一种方式?每个人都同意我的观点吗?或者我的想法有什么缺陷?
多态
这是一种以更有效的方式处理反应不同的对象的能力。不同的对象反应不同,但共享相同的方法。这些方法位于一个通用接口中。
例如,如果我们与不同类型的鸭子一起工作,我们可以说它们都有共同点,只是做事的方式略有不同。
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 中的抽象程度。
为什么会死板?显而易见的答案是输出的字符串。仔细观察,它输出(到控制台)的方式使它更加严格。
如果您的程序不支持控制台怎么办?
这就是为什么抽象很重要。
结论
在某种程度上,您是在正确的轨道上。您不需要抽象来实现多态性。然而,你的好奇心是正确的。没有抽象,就没有必要使对象多态。如果每个对象都做完全相同的事情,那么这些对象就不需要分开。它们只需要是同一对象的不同实例。
我希望这有助于阐明多态和抽象之间的区别。