Java ポリモーフィズムとは何ですか? Java ポリモーフィズムの使用

青灯夜游
リリース: 2018-10-20 17:57:02
転載
3155 人が閲覧しました

この記事では、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 方法
}
ログイン後にコピー

2 つのサブクラスを変更する必要はありません

プレーヤー クラス Player.java を変更し、play メソッドのパラメーターを親クラスに設定します

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());
    }
}
ログイン後にコピー
親クラスが戻り値として使用されますポリモーフィズムを実装するための値

プレイヤーはポリモーフィック実装を使用するためにヒーローを購入します。購入メソッドには戻り値があり、購入したヒーローを返します。親クラスはこの関数を戻り値として実装します。

プレーヤー クラス Player.java を変更し、ヒーローを取得するメソッドを追加します

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();
        }
    }
}
ログイン後にコピー
親クラスからサブクラスへの変換

Ifサブクラス内にはサブクラス固有のメソッドがいくつかあり、親クラスの参照からサブクラス固有のメソッドを呼び出すことはできません。

メソッド queenWorship を Daji.javaに追加します

package whyusepolymorphic;

public class Daji extends Hero{
    //省略构造方法及之前其他方法
    public void queenWorship() {
        System.out.println("释放大招:女王崇拜");
    }
}
ログイン後にコピー

メソッド dazzlingStar を LittleJoe.javaに追加します

package whyusepolymorphic;

public class LittleJoe extends Hero {
    //省略构造方法及之前其他方法
    public void dazzlingStar() {
        System.out.println("释放大招:星华缭乱");
    }
}
ログイン後にコピー
bigMove メソッドを Player.java

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 类或接口
ログイン後にコピー

instanceof は、通常、強制型変換と組み合わせて使用​​されます。

Player.java を変更する bigMove メソッド

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:cnblogs.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!