この記事では、Java ポリモーフィズムとは何ですか? ゲーム内のいくつかの機能を通じて Java ポリモーフィズムを使用すると、ポリモーフィズムの使用を習得するのに役立ちます。困っている友人は参考にしていただければ幸いです。
バトル ゲーム (類似点はまったくの偶然です) には、Xiao Qiao と Daji という 2 人の異なる魔術師のヒーローがいます。
どちらの魔術師ヒーローにも攻撃方法があり、Xiao Qiao の攻撃ダメージは 10 で、20 マナを消費します。妲己の攻撃ダメージは15で、30マナを消費します。プレイヤーは2人のヒーローを操作して攻撃することができます。実装されたコードを見てみましょう。
親クラス-Hero: whyusepolymorphic.Hero.java
package whyusepolymorphic; public class Hero { private int magicPoint;//魔法值 private int hurt;//伤害 private String name;//姓名 public Hero(int magicPoint, int hurt, String name) { super(); this.magicPoint = magicPoint; this.hurt = hurt; this.name = name; } public int getMagicPoint() { return magicPoint; } public void setMagicPoint(int magicPoint) { this.magicPoint = magicPoint; } //省略属性的 getter 和 setter 方法 }
サブクラス-リトル ジョー: whyusepolymorphic.LittleJoe.java
package whyusepolymorphic; public class LittleJoe extends Hero { public LittleJoe(int magicPoint, int hurt, String name) { super(magicPoint, hurt, name); } //攻击的方法 public void attack() { System.out.println(this.getName()+" 发动攻击,伤害为:"+this.getHurt() +"。消耗 20的魔法值"); this.setMagicPoint(getMagicPoint()-20);//魔法值-20 } }
Subclass-Daji:whyusepolymorphic.Daji.java
package whyusepolymorphic; public class Daji extends Hero{ public Daji(int magicPoint, int hurt, String name) { super(magicPoint, hurt, name); } public void attack() { System.out.println(this.getName()+" 发动攻击,伤害为:"+this.getHurt() +"。消耗 30的魔法值"); this.setMagicPoint(getMagicPoint()-30);//魔法值-30 } }
Player:whyusepolymorphic.Player.java
package whyusepolymorphic; public class Player { public void play(LittleJoe littleJoe) { littleJoe.attack(); } public void play(Daji daji) { daji.attack(); } }
上記のコードは完了です。要求された機能を実現すると、この少数のヒーローだけが存在するはずがないことがわかります。後から新しい魔法のヒーローが追加され、ダメージが異なる場合はどうなるでしょうか。
新しいクラスを追加して攻撃メソッドを実装したり、プレーヤー クラスを変更してヒーローを操作するためのメソッドを追加したりできます。この方法はヒーロー拡張のニーズを満たすことができますが、後でさらに多くのヒーローが追加された場合、維持するのがあまり便利ではなくなります。
上記のコードを検討すると、Player クラスの play メソッドのパラメーターはすべて Hero クラスのサブクラスであることがわかりました。1 つの play(Hero hero) メソッドを使用してすべてのヒーローを操作できますか?この最適化された設計は、多態性を使用して実現できます。
簡潔に言うと、ポリモーフィズムとは複数の形式を意味します。自然界の炭素の多形形態には、グラファイト、ダイヤモンドなどが含まれます。切断という行為には、紙を切る、髪を切るなどの行為が含まれます。同じ操作でも条件が異なると異なる結果が生じます。
この場合、プログラム内のポリモーフィズムは同じ参照型を参照し、異なるインスタンスを使用して異なる操作を実行します (親クラス参照はサブクラス オブジェクトを指定しますHero h=new Daji();
)。
ポリモーフィズムを実装する手順:
1. 継承関係を使用して親クラスとサブクラスを記述します ##2 .
サブクラスは親クラスのメソッド3をオーバーライドします。親クラスの
参照を使用して、サブクラスのオブジェクトを指します。親クラスはメソッド パラメーターとして機能します。ポリモーフィズムを実装します。ポリモーフィズムを使用して上記のコードを最適化します。
Hero.java を変更して攻撃メソッドを追加します。package whyusepolymorphic; public class Hero { //省略属性和构造方法 //攻击的方法 public void attack() { System.out.println(this.getName()+" 发动攻击,伤害为:"+this.getHurt() +"。消耗 20的魔法值"); this.setMagicPoint(getMagicPoint()-20);//魔法值-20 } //省略 getter 和 setter 方法 }
package whyusepolymorphic; public class Player { public void play(Hero hero) { hero.attack(); } }
package whyusepolymorphic; public class TestPlay { public static void main(String[] args) { Player p=new Player(); Hero daji=new Daji(100,15,"妲己"); p.play(daji); System.out.println(daji.getName()+" 剩余魔法:"+daji.getMagicPoint()); Hero littleJoe=new LittleJoe(100,10,"小乔"); p.play(littleJoe); System.out.println(littleJoe.getName()+" 剩余魔法:"+littleJoe.getMagicPoint()); } }
package whyusepolymorphic; public class Player { public void play(Hero hero) { hero.attack(); } public Hero getHero(int id) { if(1==id) { return new Daji(100,15,"妲己"); }else if(2==id){ return new LittleJoe(100,10,"小乔"); }else { System.out.println("没有这个英雄"); return null; } } }
package whyusepolymorphic; import java.util.Scanner; public class TestPlay { public static void main(String[] args) { Player p=new Player(); System.out.println("欢迎来到英雄商店,请选择要购买的英雄:1.妲己2.小乔"); Scanner input=new Scanner(System.in); int id=input.nextInt(); Hero h=p.getHero(id); if(null!=h) { h.attack(); } } }
package whyusepolymorphic; public class Daji extends Hero{ //省略构造方法及之前其他方法 public void queenWorship() { System.out.println("释放大招:女王崇拜"); } }
package whyusepolymorphic; public class LittleJoe extends Hero { //省略构造方法及之前其他方法 public void dazzlingStar() { System.out.println("释放大招:星华缭乱"); } }
package whyusepolymorphic; public class Player { //省略构造方法及之前其他方法 public void bigMove(Hero hero) { hero.dazzlingStar(); } }
hero.dazzlingStar();
エラー報告現時点では、親クラスをサブクラスに変換する必要があります(強制型変換)Hero joe=new LittleJoe(100,10,"小乔"); Daji daji=(Daji) joe;
しかしこのように直接記述すると、instanceof 演算子を使用すると、変換エラーが発生しなくなります。
对象 instanceof 类或接口
public void bigMove(Hero hero) { if (hero instanceof Daji) { ((Daji)hero).queenWorship(); }else if(hero instanceof LittleJoe) { ((LittleJoe)hero).dazzlingStar(); } }
Player p=new Player(); p.bigMove(new LittleJoe(100,10,"小乔")); p.bigMove(new Daji(100,15,"妲己"));
Java ビデオ チュートリアル、
Java 開発グラフィック チュートリアル
、ブートストラップ ビデオ チュートリアル
をご覧ください。以上がJava ポリモーフィズムとは何ですか? Java ポリモーフィズムの使用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。