在子 class 中构建方法继承/隐藏方法

Architecturing method inheritance / hiding method in child class

我正在尝试编写一些与确定性有限自动机相关的算法。所以显而易见的开始是定义实体:DFAStateEdges。然而,我虽然因为 DFA 是一种图表,我应该有基本的 classes GraphNodeEdge 每个实现 IGraph , INodeIEdge。然后 DFAState 扩展 GraphNode.

所以 Graph 的精简代码是:

class Graph
{
    //...
    public void addNode(INode node)
    {
        //...
    }
    //... 
}

现在 StateNode 之间的主要区别是 State 将属性 isFinalStateisStartingState 添加到 Node。所以我希望通过 GraphaddNode() 方法将 State 对象添加到 DFA 而不是 Node 对象。

我认为我可以在 DFA 中覆盖并创建此方法 private 并定义了一个新方法 addState() 它将接受 State 对象。但是在 Java 中不允许降低派生 class 中父 class 成员的可见性。

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

如果我正确地理解了你的例子,你可以通过泛型来实现:

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

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

如果您的 DFA class 延长了 Graph,那么它必须维持 Graph 的合同。因此,如果您需要降低方法的可见性(如您所说,在 Java 中是不可能的),则需要打破 GraphDFA 的约定,因此,DFA 不应该是 Graph 的 child。

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

您的解决方案可能是 DFA 不再扩展 Graph(也许您需要一个 IDFA 界面?)。在这种情况下,您的 DFA class 可以保留一个 Graph 作为字段。

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