如何从java堆栈中提取信息作为单独的数据类型并在方法调用中使用

xmd2e60i  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(321)

我试图通过创建一个包含2个子类型的堆栈来实现撤销功能。我有一个父类型userentry的堆栈,其中包含两个子类型assign和relentry。assign和relentry都是用于将值(数字和关系)插入网格表的类。例如,有一个方法调用将值作为各自的子类型插入表中 assignToTable() 以及 RelEntryToTable() . 我正在尝试使用一个多态方法,可以从父堆栈调用这两个子类型。

parentStack.assignAndRelEntryToTable();

在为userentry创建抽象类时,我尝试了 addToPuzzle() 方法,但在尝试使用

for (UserEntry ue : stack){
    puzzle.addToPuzzle(ue)
}

方法调用需要一个特定于每个子类的方法。我试过为每个子类创建一个方法调用,但是谜题本身不能从子类引用。
这里有4个类一起工作:ui、relentry、userentry和assign。我试图为ui类中的每个循环创建它们,因为它包含puzzle变量。

bjg7j2ky

bjg7j2ky1#

如果我没弄错你的问题,你在找 instanceof . 它让你检查一个对象是否属于给定的类型。使用它,您可以确定userentry的子类型,转换为所需的子类型,并相应地调用其中一个方法。大概是这样的:

for (UserEntry ue : stack){
    if(ue instanceof Assign){
        Assign assign = (Assign) ue;
        puzzle.assignToTable(assign );
    } else if(ue instanceof RelEntry){
        RelEntry relEntry = (RelEntry) ue;
        puzzle.relEntryToTable(relEntry);
    }
}
nnvyjq4y

nnvyjq4y2#

我很难完全理解你的要求,所以我将非常通用。
语法可能不是100%正确,但它应该给出一般的想法。

public abstract class UserEntry{

   abstract void somCommonMethod();
}

public class RelEntry extends UserEntry{

   void someCommonMethod(){
      //ownRelEntryLogic
   }
}

public class Assign extends UserEntry{

   void someCommonMethod(){
      //ownAssignLogic
   }
}

public Puzzle{

    ArrayDeque<UserEntry> stack = new ArrayDeque<>();

    public void undoLogic(){

        stack.pop().someCommonMethod();

    }

    public void add(UserEntry anyInstanceOfUserEntry){

        stack.push(anyInstanceOfUserEntry);

    }

    } 

}
public class UI{

    Puzzle p = new Puzzle();

    p.add(new RelEntry());
    p.add(new Assign());

}

相关问题