Java 如何将一个对象从同一基类转换为不同的对象?

Java 如何将一个对象从同一基类转换为不同的对象?,java,object,polymorphism,Java,Object,Polymorphism,假设我有一个棋盘游戏,玩家可以购买他们降落的方块。在我抽象的正方形基类中有一个方法,叫做: public abstract void applyLandOnAffect(Player player); 然后在我的BuyableSquares类中,我实现了如下所示的方法: @Override public void applyLandOnAffect(Player player){ //Offer them the chance buy the square here. } 然后,如

假设我有一个棋盘游戏,玩家可以购买他们降落的方块。在我抽象的正方形基类中有一个方法,叫做:

public abstract void applyLandOnAffect(Player player);
然后在我的BuyableSquares类中,我实现了如下所示的方法:

@Override
 public void applyLandOnAffect(Player player){
    //Offer them the chance buy the square here.
}
然后,如果他们选择购买正方形,我希望对象从BuyableSquares()变为BoughtSquares()。BoughtSquare中的代码将处理当另一个玩家降落在购买的广场上时发生的情况。但问题是我应该如何以及在哪里改变它

我在想这类代码:

this = new BoughtSquare();
但这不是公认的语法

我该如何处理这个问题


谢谢

如果您使用多态性来根据方形实例的类型对其进行不同的处理,我的建议是使用状态设计模式

要在应用程序中引入它,您应该:

  • 定义一个名为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
    类中引入一个新属性,该属性将存储Square的当前状态

    public class Square {
        private SquareState state;
        // ..
    }
    
完成此操作后,更改广场的状态将需要调用:

this.state = new BoughtSquare();

您应该只拥有一个名为
Square
的类,而不是为购买的正方形和未购买的正方形单独设置类。或者,如果您计划购买其他类型的不可购买的正方形,则可以扩展
正方形。在类中创建一个名为
purchased
的布尔值,默认设置为
false
。然后,当购买正方形时,您可以将该值设置为
true

public class PurchaseableSquare extends Square
{
    private boolean purchased;

    public Square()
    {
        this.purchased = false;
    }

    public void purchaseSquare()
    {
        this.purchased = true;
    }
}

首先,你不能给这个
分配任何东西

为了实现您想要的,为什么不在
BuyableSquares
类中创建一个标志,指示是否购买了正方形

 public class BuyableSquares extends Squares {

     private boolean bought = false; // by default

     //...

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

实例化对象后,就不能更改其类


一个选项是,由于两个类都已经扩展了一个超类,所以可以使用它作为类的引用,这样您就可以轻松地替换它们。因此,您将电路板存储为一组(或列表或数组)正方形,每个正方形都是
BuyableSquare
BoughtSquare
。当必须转换
BuyableSquare
时,您可以从结构中将其替换为相应的
BoughtSquare
(当然,建议使用将原始
BuyableSquare
作为参数的
BoughtSquare
构造函数).

我同意上一篇文章的观点,
状态
模式是最好的。使用状态变量设置
Square
类,当该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){
      ...
    }
}

这是证明规则优先组合而不是继承的一个例子

在本例中,您有定义行为的
Square
子类型。问题是您的对象无法更改类,因此无法将其从
BuyableSquare
转换为
BoughtSquare
。基于构图的设计将为广场的状态创造一个新的界面。所以Square有一个
SquareState
。购买方和未购买方的不同行为将在SquareState接口的不同子类型中定义。所以当有人买了一个正方形,你就改变了它的状态。比如:

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

你永远不能给
这个
@cmbaxter赋值。我对这个答案做了增量编辑,从大纲开始,然后在末尾添加了代码片段:)