我有一个充当投注者的类,在该类中,投注者可以在创建投注的方法中下注。但是,下注类的构造函数需要从下注者类中获取该下注者的相同引用。如何做到这一点?
这是我尝试使用的代码。我意识到制作了一个关于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中?
答案 0 :(得分: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代替其他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);
}
这可能不是最好的解决方案,但我希望它至少为你开辟了一些可能性。
答案 1 :(得分:1)
只需将this
关键字作为投注者实例传递。