我正在尝试编写一些确定性有限自动机相关算法。所以明显的开始是定义实体:DFA
,State
和Edges
。但是,我认为DFA
是一种图表,我应该有基本类Graph
,Node
和Edge
,每个都实现IGraph
,{{1} }和INode
。然后让IEdge
和DFA
延伸State
和Graph
。
所以Node
的精简代码是:
Graph
现在class Graph
{
//...
public void addNode(INode node)
{
//...
}
//...
}
和State
之间的主要区别在于Node
将属性State
和isFinalState
添加到isStartingState
。因此,我希望通过Node
的{{1}}方法将State
个对象添加到DFA
而不是Node
个对象。
我认为我可以在Graph
中覆盖并制作此方法addNode()
,并定义了一个接受private
个对象的新方法DFA
。但是Java中不允许降低派生类中父类成员的可见性。
那么在这种情况下遵循的标准解决方案/方法是什么。或者我认为这一切都错了?
答案 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
作为字段保留。
另外,考虑确定性有限自动机是什么,它不是图形,它是一个可以用图表表示的状态机。