取决于2个输入参数的子类型的更改方法行为

问题描述 投票:0回答:1

我正在尝试使用简洁的班级设计制作纸牌游戏。我想比较2张卡片并返回“价值”最高的一张。

我有一个抽象卡类和从它继承的2个类:

public abstract class Card {...}
public class ColoredCard extends Card {...}
public class TrumpCard extends Card {...}

我想使用一个compare方法,根据卡的子类型,该方法将具有不同的实现逻辑,那样(我将这些方法放在外部的“ Comparator”类中:]]

public class Comparator {
    //1st subtype combination
    public Card compare(ColoredCard card, TrumpCard card2) {
      //implementation using card.specificTrumpCardMethod()

    //2nd subtype combination
    public Card compare(ColoredCard card, ColoredCard card2) {
      //implementation using card.specificColoredCardMethod() and card2.specificColoredCardMethod()

    //other type combinations
}

但是当我从Cards类中调用它时,它会引发编译错误:>

//within any card subclass
public Card compareTo(Card c) {
    return Comparator.compare(this, c); //compilation error because it cant determine "c" variable subtype

您将为此目的推荐哪种设计?有解决这个问题的简便方法吗?

如果可能,我想避免使用instanceOf指令或反射。

谢谢,

我正在尝试使用简洁的班级设计制作纸牌游戏。我想比较2张卡片并返回一张具有最高“价值”的卡片。我有一个抽象卡类和从它继承的2个类...

java oop design-patterns
1个回答
0
投票

[如果可能,我会在基类上定义一个抽象方法,该方法可以让子类提供其绝对值。然后,可以使基类为Comparable,并实现使用此值的compareTo()方法。该值甚至不需要公开显示。

public static abstract class Card implements Comparable<Card> {

    @Override
    public int compareTo(Card other) {
        return Integer.compare(this.value(), other.value());
    }

    protected abstract int value();
}

public static class ColoredCard extends Card {

    @Override
    protected int value() {
        return 1;
    }
}

public static class TrumpCard extends Card {

    @Override
    protected int value() {
        return 10;
    }
}

public static void main(String... args) throws Exception {
    System.out.println(new TrumpCard().compareTo(new ColoredCard()));
    System.out.println(new ColoredCard().compareTo(new TrumpCard()));
}
© www.soinside.com 2019 - 2024. All rights reserved.