私はこのコードを持っている:サブクラスの型チェックを避けるには?
public abstract class Character {
public abstract void attack(Character victim);
public abstract void receiveAttack(Attack attack);
}
public class CharacterA extends Character {
public void attack(Character victim) {
if (victim.getClass().equals(this.getClass())
return;
victim.receiveAttack(new Attack(BASE_DMG));
}
}
アイデアは文字が他の文字から/への攻撃とreceiveAttacksことができるということですが、それはそれ自身のクラスの性格から来て攻撃を受けることができない(CharacterAは別のものを攻撃することはできませんがキャラクターBを攻撃したり、キャラクターBからの攻撃を受けることができます。
私は、オブジェクトのタイプのチェックが悪い匂いであることを知っています。通常、デザインが悪いために発生します。そのため、デザインを変更してオブジェクトタイプを確認する必要はありません?
EDIT
クラスは、実際には名前だけの例を簡素化することで、Character
命名されていません。
チームはありません。 CharacterA
は、CharacterA
ではない他のCharacter
を攻撃することができます。
FINAL EDIT
みんなありがとう、私はVisitorパターンを使用して、それを解決しました。
私はあなた 'CharacterA'と' CharacterB'が、彼らは共通の祖先の異なる実装する必要があること、とても異なっているが、私はプロパティを使用するかどうかわかりませんそれらを区別するために... –
答えをありがとう。彼らは様々な方法で 'attack'と' receiveAttack'メソッドを実装します。キャラクターBはアーマーを持っているので、被害が少なく、キャラクターAが特殊効果で攻撃を送るかもしれません。プロパティ(Stateパターンのようなもの)を使用しても、そのプロパティのオブジェクトタイプをチェックする必要はありませんか? –
Characterのいくつかのサブクラスがあり、一般的なルールは常にあなた自身のクラスの何かを攻撃することができないということです、あなたが行ったことは完全にうまくいきます。ところで、あなたのクラスの1つに 'java.lang'のクラスと同じ名前を付けると、物事がひどく間違ってしまう可能性があります。 –