0

我有一个充当投注者的类,在该类中,投注者可以在创建投注的方法中下注。但是,bet 类的构造函数需要从 bettor 类中获取该 bettor 的相同引用。如何做到这一点?

这是我试图用于此的代码。我意识到对 bettor 类进行了新的引用,但我想无论如何我都会尝试一下

public Bet placeBet(Bet.BetType betType, double amount)
{
    if(betType.equals(Bet.BetType.passBet))
    {
        this.bankroll=bankroll-amount;
        return new PassBet(new Bettor(this.name,this.bankroll),amount);
    }
    else if(betType.equals(Bet.BetType.any7))
    {
        this.bankroll=bankroll-amount;
        return new Any7Bet(new Bettor(this.name,this.bankroll),amount);
    }
    else if(betType.equals(Bet.BetType.hard8)||betType.equals(Bet.BetType.hard10))
    {
        this.bankroll=bankroll-amount;
        return new HardWayBet(new Bettor(this.name,this.bankroll),amount);
    }
    return null;
}

而 PassBet 类看起来是这样的(它是 Bet 类的子类,它包含 Bettor 参考和投注金额)。

public PassBet(Bettor b, double amount)
{
    super(b,amount);
}

我将如何将原始 Bettor 作为参数传递到我的 PassBet 子类中,然后将其存储在超类 Bet 中?

4

2 回答 2

2

您可以this像任何其他参考一样传递给另一个方法/构造函数。例如:

public Bet placeBet(Bet.BetType betType, double amount)
{
    if(betType.equals(Bet.BetType.passBet))
    {
        this.bankroll=bankroll-amount;
        return new PassBet(this,amount);
    }
    else if(betType.equals(Bet.BetType.any7))
    {
        this.bankroll=bankroll-amount;
        return new Any7Bet(this,amount);
    }
    else if(betType.equals(Bet.BetType.hard8)||betType.equals(Bet.BetType.hard10))
    {
        this.bankroll=bankroll-amount;
        return new HardWayBet(this,amount);
    }
    return null;
}

顺便说一句,我建议不要null在条件都不匹配时返回。例如,考虑抛出一个IllegalArgumentException。就像rcook指出的那样,BetType似乎是一个很好的enum候选者,在这种情况下,您可以使用switch而不是 else if 等。这是一个粗略的例子:

public enum BetType {
    PASS,
    ANY_7,
    HARD_8,
    HARD_10;
}

...

public Bet placeBet(BetType betType, double amount) {

    final Bet bet;

    switch (betType) {
        case PASS:
            bet = new PassBet(this, amount);
            break;
        case ANY_7:
            bet = new Any7Bet(this, amount);
            break;
        case HARD_8:
        case HARD_10:
            bet = new HardWayBet(this, amount);
            break;
        default:
            throw new IllegalArgumentException("Invalid bet type: " + betType + ".");
    }

    this.bankroll -= amount;

    return bet;
}

这个解决方案仍然可以更加面向对象,例如为什么不提供BetType一个创建Bet? 我们可以利用多态性:

public enum BetType {
    PASS {
        @Override
        public Bet makeBet(Bettor bettor, double amount) {
            return new PassBet(bettor, amount);
        }
    },
    ANY_7 {
        @Override
        public Bet makeBet(Bettor bettor, double amount) {
            return new Any7Bet(bettor, amount);
        }
    },
    HARD_8 {
        @Override
        public Bet makeBet(Bettor bettor, double amount) {
            return new HardWayBet(bettor, amount);
        }
    },
    HARD_10 {
        @Override
        public Bet makeBet(Bettor bettor, double amount) {
            return new HardWayBet(bettor, amount);
        }
    };

    public abstract Bet makeBet(Bettor bettor, double amount);
}

...

public Bet placeBet(BetType betType, double amount) {

    this.bankroll -= amount;

    return betType.makeBet(this, amount);
}

这甚至可能不是最好的解决方案,但我希望它至少为您开辟了一些可能性。

于 2013-04-03T02:30:50.317 回答
1

只需将this关键字作为 bettor 实例传递。

于 2013-04-03T02:21:48.023 回答