将项目添加到子类

时间:2017-01-18 17:47:52

标签: java oop abstract-class

我有一个Abstract类(RandomEvent),它包含一个Hashmap(带有示例度量的sampleSpace)。必须在子类中填充此Hashmap。 有没有办法让它只在子类中可见和可编辑但不在我放置Abstract类的同一个包中? 在我看来,这不能仅使用java类来解决...也许有一些模式? 这就是我做的:     

public abstract class RandomVariable<Sample> {

    private final Hashtable<Sample, Integer> sampleSpace;
    private boolean setted;

    public RandomVariable() {
        sampleSpace = new Hashtable<>();

        setted = false;
        setSampleSpace();
        setted = true;
    }

    public Sample fireEvent() {
        //return one sample chosen randomly according to the probability measure
    }

    protected Map<Sample, Integer> getSampleSpace() {
        if(setted==true) {
            Map<Sample, Integer> ret = new Hashtable<>();
            ret.putAll(sampleSpace);
            return ret;
        }
        return sampleSpace;
    }

    protected abstract void setSampleSpace(); 

    public double getProbability(final Set<Sample> subset) {
        //return probability of a subset of the sample space
    }

    public double getProbability(Sample sample) {
        //return probability a the sample
    }

    public boolean isSetted() {
        return setted;
    }
}

因此,setSampleSpace()方法必须在子类中实现,这些子类将定义具体的随机事件(具有精确的样本集)。 这是一个例子:

public class Coin extends RandomVariable<String> {
    @Override
    protected void setSampleSpace() {
        if(!isSetted()) {
            super.getSampleSpace().put("head", 1);
            super.getSampleSpace().put("back", 1);
        }
    }
}

在c ++中,我刚刚将Hashmap声明为受保护,但我现在正在研究java,并且似乎在访问修饰符中存在一些差异。 谢谢你的回答!

2 个答案:

答案 0 :(得分:0)

实现这一目标的唯一方法是为抽象类及其实现创建一个子包。例如:

org.example.application.random.RandomVariable
org.example.application.random.impl.Coin

然后,当从包外部使用这些类时,您将获得所需的API封装级别。

答案 1 :(得分:0)

我可能会让子类使用初始数据填充Map,然后将对Map的引用保存为不可修改的映射。这应该有助于摆脱您的setted变量。

public abstract class RandomVariable<Sample> {
    private final Map<Sample, Integer> sampleSpace;

    public RandomVariable() {
        Map<Sample, Integer> map = new HashMap<>();
        populateSampleSpace(map);
        this.sampleSpace = Collections.unmodifiableMap(map);
    }

    protected abstract void populateSampleSpace(Map<Sample, Integer> sampleSpace);
}

然后子类只需要将数据添加到提供给Map的{​​{1}}中,并且父类可以确保在填充数据后,populateSampleSpace()不能被修改。