flm.fly()
両方とも同じ答えを私にj.fly()
与えるとき、ポリモーフィズムの利点は何ですか?
利点は
FlyingMachines flm = new Jet();
flm.fly();
戻り値
"Start, Taxi, Fly"
それ以外の
"No implementation"
それがポリモーフィズムです。fly()
タイプのオブジェクトを呼び出すFlyingMachine
と、それが実際にはaであることがわかり、を出力する間違ったメソッドではなくJet
、適切なメソッドを呼び出します。fly()
"No implementation"
つまり、タイプのオブジェクトを処理するメソッドを記述し、またはFlyingMachine
のようなすべての種類のサブタイプをフィードすることができます。これらのメソッドは常に正しいことを行います。つまり、常に同じことを行うのではなく、適切なタイプのメソッドを呼び出すこと、つまり出力します。Jet
Helicopter
fly()
"No implementation".
ポリモーフィズム
あなたの例では、ポリモーフィズムは役に立ちません。
a)とb)は同じコインの両面です。
その方法をお見せしましょう。
コード例
import java.util.ArrayList;
import java.util.List;
import static java.lang.System.out;
public class PolymorphismDemo {
public static void main(String[] args) {
List<FlyingMachine> machines = new ArrayList<FlyingMachine>();
machines.add(new FlyingMachine());
machines.add(new Jet());
machines.add(new Helicopter());
machines.add(new Jet());
new MakeThingsFly().letTheMachinesFly(machines);
}
}
class MakeThingsFly {
public void letTheMachinesFly(List<FlyingMachine> flyingMachines) {
for (FlyingMachine flyingMachine : flyingMachines) {
flyingMachine.fly();
}
}
}
class FlyingMachine {
public void fly() {
out.println("No implementation");
}
}
class Jet extends FlyingMachine {
@Override
public void fly() {
out.println("Start, taxi, fly");
}
public void bombardment() {
out.println("Fire missile");
}
}
class Helicopter extends FlyingMachine {
@Override
public void fly() {
out.println("Start vertically, hover, fly");
}
}
説明
a)MakeThingsFly
クラスは、タイプがすべてのものを処理できますFlyingMachine
。
b)このメソッドletTheMachinesFly
は、新しいクラスを追加するときにも変更なしで機能します(!)。次に例を示しPropellerPlane
ます。
public void letTheMachinesFly(List<FlyingMachine> flyingMachines) {
for (FlyingMachine flyingMachine : flyingMachines) {
flyingMachine.fly();
}
}
}
それがポリモーフィズムの力です。これを使用して、 open-closed-principleを実装できます。