假设我有一个棋盘游戏,玩家可以购买他们登陆的方块。我在Squares的抽象基类中有一个方法叫做:
public abstract void applyLandOnAffect(Player player);
然后在我的BuyableSquares类中,我实现了如下所示的方法:
@Override
public void applyLandOnAffect(Player player){
//Offer them the chance buy the square here.
}
然后,如果他们选择购买广场,我希望该对象从BuyableSquares()变为BoughtSquare()。 BoughtSquare中的代码将处理当另一个玩家登陆购买的广场时发生的事情。但问题是我应该如何以及在何处改变它。
我在考虑这种类型的代码:
this = new BoughtSquare();
但它不是语法。
我该如何处理?
由于
答案 0 :(得分:2)
如果您使用多态来根据其类型对Square实例进行不同的处理,我的建议是使用状态设计模式。
要在您的应用程序中介绍它,您应该:
定义一个名为eg的新接口SquareState
方法根据方形类型而不同
public interface SquareState {
void applyLandOnAffect(Player player);
}
定义将实现此接口的所有方形类型,并提供SquareState
接口
public AvailableState implements SquareState {
public void applyLandOnAffect(Player player) { // ..
}
}
public BoughtState implements SquareState {
public void applyLandOnAffect(Player player) { // ..
}
}
在Square
类中引入一个新属性,用于存储方块的当前状态
public class Square {
private SquareState state;
// ..
}
完成后,改变Square的状态将是一个问题:
this.state = new BoughtSquare();
答案 1 :(得分:0)
您应该只有一个名为Square
的班级,而不是为购买的广场和未购买的广场设置单独的班级。或者,如果您打算使用其他类型的不可购买的方格,您可以延长Square
。在名为purchased
的类中创建一个默认设置为false
的布尔值。然后,当购买广场时,您可以将值设置为true
。
public class PurchaseableSquare extends Square
{
private boolean purchased;
public Square()
{
this.purchased = false;
}
public void purchaseSquare()
{
this.purchased = true;
}
}
答案 2 :(得分:0)
首先,您无法为this
分配任何内容。
为了达到你想要的效果,为什么不在BuyableSquares
类中创建一个标志,表明是否购买了方格。
public class BuyableSquares extends Squares {
private boolean bought = false; // by default
//...
public void markAsBought() {
bought = true;
}
}
答案 3 :(得分:0)
实例化对象后,您无法更改其类。
一个选项是,因为两个类都已经扩展了一个超类,所以使用它作为类的引用,这样你就可以轻松地替换它们。因此,您将您的电路板存储为Square的集合(或列表或数组),每个都是BuyableSquare
或BoughtSquare
。如果必须转换BuyableSquare
,则使用通讯人BoughtSquare
将其替换为您的结构(当然,BoughtSquare
构造函数将原始BuyableSquare
作为参数将是可取)。
答案 4 :(得分:0)
我同意上一篇文章State
模式最好。使用状态变量设置Square
类,当该方块发生不同事件时,您可以切换到不同的状态。然后,让每个状态封装当玩家落在广场上并且处于特定状态时发生的行为。要更改状态,只需将SquareState
的其他实例重新分配给state
变量即可。一个非常简单的轮廓看起来像这样。
interface SquareState{
void applyLandOnAffect(Player player);
}
public class Square{
private SquareState state = new AvailabelState();
}
public AvailableState implements SquareState{
public void applyLandOnAffect(Player player){
...
}
}
public BoughtState implements SquareState{
public void applyLandOnAffect(Player player){
...
}
}
答案 5 :(得分:0)
这是证明规则偏好合成优于继承的一个例子。
在您的情况下,您有Square
个子类型,您可以在其中定义行为。问题是您的对象无法更改类,因此无法将其从BuyableSquare
转换为BoughtSquare
。基于组合的设计将为方形状态创建新的界面。所以Square有一个SquareState
。买入和未买入方块的不同行为将在SquareState接口的不同子类型中定义。因此,当有人购买广场时,你只需更改其状态即可。类似的东西:
public class Square {
private SquareState state = new Buyable();
public void buyMe() {
this.state=new Bought();
}
}