我在Player.java中的当前代码如下:
public boolean canPutCard(Card card) {
if (!handCards.contains(card)) {
return false;
}
if (card instanceof ActivableCard) {
boolean hasEmpty = false;
int i = card instanceof CharacterCard ? 0 : 1;
for (int j = 0; j < fieldCards[i].length; ++j) {
if (fieldCards[i][j] == null) {
hasEmpty = true;
}
}
if (!hasEmpty) {
return false;
}
}
return (card instanceof LandCard && !hasPutLandCard) || (card instanceof PoweredCard
&& ((PoweredCard) card).getPowerNeeded() <= currentElementValue[card.getElementType().ordinal()]);
}
我想避免在这里使用多个instanceof,因为它们称之为“代码气味”,而改用多态。因此,我可以做的就是将其重写为:
public boolean canPutCard(LandCard card) {
return !hasPutLandCard;
}
public boolean canPutCard(PoweredCard card) {
return card.getPowerNeeded() <= currentElementValue[card.getElementType().ordinal()];
}
private boolean canPutCard(int i, PutableCard card) {
boolean hasEmpty = false;
for (int j = 0; j < fieldCards[i].length; ++j) {
if (fieldCards[i][j] == null) {
hasEmpty = true;
}
}
return hasEmpty;
}
public boolean canPutCard(PutableCard card) {
return canPutCard(1, card);
}
public boolean canPutCard(CharacterCard card) {
return canPutCard(0, card);
}
public boolean canPutCard(Card card) {
return handCards.contains(card);
}
类:
abstract class SkillCard extends Card implements PoweredCard
class CharacterCard extends Card implements PoweredCard, PutableCard
class LandCard extends Card
但是,肯定不会起作用,因为它不会检查所有情况。
在这种情况下是否可以避免instanceof并改用多态?