我有两节课。一个是公共类,另一个是带有HashMap对象的抽象类。如何从公共类中调用抽象类'HashMap .get(string)
方法?我是Java的新手,可能遇到了这个问题,因为我不了解如何正确设置我的java文件。
以下是我的两个类的部分......(在同一个文件中Evaluator.java
)
public class Evaluator {
...code
public int eval (String expr) {
Operator newOpr = (Operator) operators.get(tok);
}
... more code
}
//abstract class
abstract class Operator {
Operator(){
HashMap operators = new HashMap();
operators.put("+",new AdditionOperator());
operators.put("-",new SubtractionOperator());
}
abstract int priority();
static boolean check(String tok){
return true;
}
abstract Operand execute(Operand opd1, Operand opd2);
}
//priority 2, addition and subtraction
class AdditionOperator extends Operator{
@Override
int priority(){
return 2;
}
@Override
public Operand execute (Operand op1, Operand op2){
...code
}
}
答案 0 :(得分:1)
欢迎来到java世界! 如果你想要一个精确的解决方案,请给我们两个类(公共和抽象)的代码。
您可能需要创建一个非抽象类,它扩展抽象类以调用方法。
答案 1 :(得分:1)
您无法在抽象类上调用方法。你需要一个类的实例。由于该类是抽象的,因此您必须为其创建一个具体的类来获取该方法。
class Foo extends AbstractFoo
{
... Implement any required methods ...
}
现在你可以这样做:
Foo bar = new Foo();
bar.get("thing");
答案 2 :(得分:0)
问题的直接答案是使您的HashMap成为公共字段或静态字段。
abstract class Operator {
public static HashMap operators;
Operator(){
Operator.operators = new HashMap();
Operator.operators.put("+",new AdditionOperator());
Operator.operators.put("-",new SubtractionOperator());
}
}
public class Evaluator {
...code
public int eval (String expr)
Operator newOpr = (Operator) Operator.operators.get(tok);
}
... more code
}
我会说HashMap是错误的类。这样,您的HashMap必须是静态字段或公共字段。在我看来,你甚至不需要一个算术摘要课程。接口可以完成这项工作,HashMap可以在一个名为OperatorFactory的类中,并且只公开一个公共方法Operator create(string operator)。通过这种方式,您的Evaluator类甚至不需要知道其他类正在使用的内部数据结构。
interface Operator(){
public Operand execute(Operator op1, Operator op2);
}
public class AdditionOperator implements Operator{
public Operand execute(Operand op1, Operand op2){
return op1;
}
}
public class OperatorFactory(){
//Could use a HasMap internally in this class but it doesn't matter
//to the other classes
public Operator crate(string operator){
if( operator == "+")
return new AdditionOperator();
}
}
public class Evaluator {
...code
OperatorFactory operatorFactory;
public Evaluator(OperatorFactory operatorFactory){
operatorFactory = operatorFactory;
}
public int eval (String expr) {
Operator newOpr = operatorFactory.create(tok);
}
... more code
}