如何访问抽象类'Hashmap?

时间:2016-02-10 19:59:06

标签: java class hashmap abstract

我有两节课。一个是公共类,另一个是带有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
        }

    }

3 个答案:

答案 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
 }