Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试使用抽象类进行模块化_Java_Inheritance - Fatal编程技术网

Java 尝试使用抽象类进行模块化

Java 尝试使用抽象类进行模块化,java,inheritance,Java,Inheritance,我一直在学习模块化代码,我一直在努力解决一个我已经有一段时间的问题。我有两个抽象类,这两个类都有多个子类。其中一个类试图制作一个hashmap来存储另一个抽象类的所有子类的对象。但是如果我有一些子类所特有的方法,我就不能在hashmap中存储的对象上调用它们,因为它们不是同一类型的。如何在保持代码模块化的同时解决这个问题 第一个抽象类中的hashmap: protected Map<Ruler, List<Nation> nations = new HashMap<Rul

我一直在学习模块化代码,我一直在努力解决一个我已经有一段时间的问题。我有两个抽象类,这两个类都有多个子类。其中一个类试图制作一个hashmap来存储另一个抽象类的所有子类的对象。但是如果我有一些子类所特有的方法,我就不能在hashmap中存储的对象上调用它们,因为它们不是同一类型的。如何在保持代码模块化的同时解决这个问题

第一个抽象类中的hashmap:

protected Map<Ruler, List<Nation> nations = new HashMap<Ruler, List<Nation>();

与类型Nation的“calculateGovernmentCost()”未定义相比较。

发布类的声明。您的设计让我有点困惑。为什么
标尺
有一个从
标尺
列表
s的映射?为什么
标尺
s引用了
标尺
?回答这些问题将有助于决定什么是最佳设计。解决问题的简单方法是使用
instanceof
检查和强制转换,但这不是很干净。泛型可能会让事情变得更清晰,如果我们能更多地了解您的设计约束的话。我需要一种模块化的方式(我认为一个映射可能会工作,但它没有)来拥有不同的统治者和国家的子类,我可以将不同的国家子类存储到统治者子类中。但目前我想不出一种方法来存储所有与单一统治者类型相关的国家(任何类型)。我这样做的问题是统治者子类无法访问Nation子类中的方法。很抱歉解释得不好。多亏了奥格雷。仿制药是一条出路。
public abstract class Ruler {

    protected Ruler ruler;
    protected Map<Ruler, List<Nation> nations = new HashMap<Ruler, List<Nation>();

    public Ruler(Ruler ruler) {
        super();
        this.ruler= ruler;
        this.ruler.put(ruler, new ArrayList<Nation>());;
    }
}

public class Government extends Ruler {
    public Government(Ruler ruler) {
        super(ruler);
    }

    public double totalGovernmentCost() {
        double cost = 0;
        for (Nation nation : this.nations.get(ruler)) {
            cost += nation.calculateGovernmentCost();
        }
    }
}
nation.calculateGovernmentCost();