2013-05-21 46 views
0

假设我有一款棋盘游戏,玩家可以购买他们登陆的广场。我在我的抽象基类方的所谓的方法是:如何将对象转换为来自同一基类的不同对象?

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

您无法将_ever_值赋给'this'。 –

回答

2

如果使用多态有根据其类型广场实例的不同处理,我的建议是使用状态设计模式

要在您的应用程序,你应该将其引入:

  • 定义一个名为如新界面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; 
        // .. 
    } 
    

一旦你做到这一点,改变了广场的状态将是调用的问题:

this.state = new BoughtSquare(); 
+0

看起来很熟悉,只有我在10分钟前完成=) – cmbaxter

+0

@cmbaxter我已经完成了对这个答案的增量编辑,以大纲开始,然后在末尾添加了代码片段:) –

+1

只是蛮横的你。我承认“国家”是你的主意...... – cmbaxter

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; 
    } 
} 
0

首先,你不能分配什么this

为了达到你想要什么,为什么在BuyableSquares类不能创建一个标志,指示方是否被买走。

public class BuyableSquares extends Squares { 

    private boolean bought = false; // by default 

    //... 

    public void markAsBought() { 
      bought = true; 
    } 
} 
0

一旦你实例化一个对象,你不能改变它的类。

的选择将是,因为这两个类已经扩展超类,用其作为参考类,所以你可以很容易地替换它们。因此,您将棋盘作为一组(或列表或阵列)存储在Square中,它们中的每一个都是BuyableSquareBoughtSquare。当BuyableSquare必须转型,从您的结构与通信BoughtSquare(当然,一个BoughtSquare构造函数原来BuyableSquare作为一个参数将是可取的)替换它。

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){ 
     ... 
    } 
} 
0

这是证明规则偏好组合超过继承的例子之一。

你的情况,你有Square亚型在其中定义的行为。问题是你的对象不能改变类,所以它不能从BuyableSquare转换为BoughtSquare。基于构图的设计将为广场的状态创造一个新的界面。所以Square有SquareState。购买和未购买方块的不同行为将在SquareState界面的不同子类型中定义。所以当有人购买广场时,你只需改变它的状态。类似于:

public class Square { 
    private SquareState state = new Buyable(); 
    public void buyMe() { 
     this.state=new Bought(); 
    } 
} 
相关问题