如何将对象转换为同一基类中的不同对象?

时间:2013-05-21 23:33:24

标签: java object polymorphism

假设我有一个棋盘游戏,玩家可以购买他们登陆的方块。我在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();

但它不是语法。

我该如何处理?

由于

6 个答案:

答案 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的集合(或列表或数组),每个都是BuyableSquareBoughtSquare。如果必须转换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();
    }
}