在子类中构造方法继承/隐藏方法

时间:2015-03-07 12:35:27

标签: java oop design-patterns architecture

我正在尝试编写一些确定性有限自动机相关算法。所以明显的开始是定义实体:DFAStateEdges。但是,我认为DFA是一种图表,我应该有基本类GraphNodeEdge,每个都实现IGraph,{{1} }和INode。然后让IEdgeDFA延伸StateGraph

所以Node的精简代码是:

Graph

现在class Graph { //... public void addNode(INode node) { //... } //... } State之间的主要区别在于Node将属性StateisFinalState添加到isStartingState。因此,我希望通过Node的{​​{1}}方法将State个对象添加到DFA而不是Node个对象。

我认为我可以在Graph中覆盖并制作此方法addNode(),并定义了一个接受private个对象的新方法DFA。但是Java中不允许降低派生类中父类成员的可见性。

那么在这种情况下遵循的标准解决方案/方法是什么。或者我认为这一切都错了?

2 个答案:

答案 0 :(得分:1)

如果我正确地得到你的例子,你可以通过Generics实现这个:

class Graph<T extends Node> {
    public void addNode(T node) { ... }
}

class DFA extends Graph<State> {
    @Override
    public void addNode(State node) { ... }
}

答案 1 :(得分:0)

如果您的DFA课程延长Graph,那么它必须保持Graph的合同。因此,如果您需要降低方法的可见性(如您所说,在Java中不可能),则需要中断Graph的{​​{1}}合同,因此,{{1不应该是DFA的孩子。

另一种说法是,由于DFA不能Graph,因此DFA不是Node

您的解决方案可能是DFA不再延长Graph(也许您需要DFA接口?)。在这种情况下,您的Graph课程可以将IDFA作为字段保留。

另外,考虑确定性有限自动机是什么,它不是图形,它是一个可以用图表表示的状态机。