Last active
December 24, 2020 08:52
-
-
Save ByungJun25/d14b8154437cc886d757111cad5f18d5 to your computer and use it in GitHub Desktop.
Double dispatch example.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.Arrays; | |
import java.util.List; | |
public class Main { | |
public static abstract class Weapon { | |
protected int attackPoint; | |
public Weapon(int attackPoint) { | |
this.attackPoint = attackPoint; | |
} | |
public abstract double attackPoint(Warrior warrior); | |
public abstract double attackPoint(Magician magician); | |
public abstract double attackPoint(Archer archer); | |
} | |
public static abstract class Character { | |
public abstract void attack(Weapon weapon); | |
} | |
public static class Sword extends Weapon { | |
public Sword(int attackPoint) { | |
super(attackPoint); | |
} | |
@Override | |
public double attackPoint(Warrior warrior) { | |
return this.attackPoint; | |
} | |
@Override | |
public double attackPoint(Magician magician) { | |
return this.attackPoint * 0.3; | |
} | |
@Override | |
public double attackPoint(Archer archer) { | |
return this.attackPoint * 0.5; | |
} | |
} | |
public static class Arrow extends Weapon { | |
public Arrow(int attackPoint) { | |
super(attackPoint); | |
} | |
@Override | |
public double attackPoint(Warrior warrior) { | |
return this.attackPoint * 0.5; | |
} | |
@Override | |
public double attackPoint(Magician magician) { | |
return this.attackPoint * 0.3; | |
} | |
@Override | |
public double attackPoint(Archer archer) { | |
return this.attackPoint; | |
} | |
} | |
public static class Wand extends Weapon { | |
public Wand(int attackPoint) { | |
super(attackPoint); | |
} | |
@Override | |
public double attackPoint(Warrior warrior) { | |
return this.attackPoint * 0.3; | |
} | |
@Override | |
public double attackPoint(Magician magician) { | |
return this.attackPoint; | |
} | |
@Override | |
public double attackPoint(Archer archer) { | |
return this.attackPoint * 0.3; | |
} | |
} | |
public static class Warrior extends Character { | |
@Override | |
public void attack(Weapon weapon) { | |
System.out.println("Warrior attack! - "+ weapon.getClass().getSimpleName() +" attack point: " + weapon.attackPoint(this)); | |
} | |
} | |
public static class Magician extends Character { | |
@Override | |
public void attack(Weapon weapon) { | |
System.out.println("Magician attack! - "+ weapon.getClass().getSimpleName() +" attack point: " + weapon.attackPoint(this)); | |
} | |
} | |
public static class Archer extends Character { | |
@Override | |
public void attack(Weapon weapon) { | |
System.out.println("Archer attack! - "+ weapon.getClass().getSimpleName() +" attack point: " + weapon.attackPoint(this)); | |
} | |
} | |
public static void main(String[] args) { | |
List<Weapon> weapons = Arrays.asList(new Sword(10), new Arrow(10), new Wand(10)); | |
List<Character> characters = Arrays.asList(new Warrior(), new Magician(), new Archer()); | |
characters.forEach(c -> weapons.forEach(w -> c.attack(w))); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment