【问题标题】:Architecturing method inheritance / hiding method in child class子类中的架构方法继承/隐藏方法
【发布时间】:2015-03-07 12:35:27
【问题描述】:

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

所以Graph 的精简代码是:

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

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

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

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

【问题讨论】:

  • “我认为我可以在 DFA 中覆盖并将此方法设为私有”。在 Java 中,访问级别不能比被覆盖方法的访问级别更严格。这意味着您不能覆盖公共方法并将其访问说明符更改为私有。
  • 是的,我知道,关键是我应该如何应对这种情况。我希望我的要求是真实的,并且不会弄乱 OO 基础知识。
  • 由于您的问题不清楚,目前对任何事情发表评论都有些困难。将您计划创建的每个类的骨架以及您计划添加到它们的一些基本方法放入问题中以使其更清晰。
  • 我不认为你想错了,但我可能不会建模 State,除非它的存在是解决问题的基础。在某些时候,我们用不必要的专业化来分裂青蛙的毛发并且完成的很少。我会把isStartingStateisFinalState 放在Node 上,然后称之为美好的一天。

标签: java oop design-patterns architecture


【解决方案1】:

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

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

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

【讨论】:

  • 或者class Graph&lt;T extends Node&gt;
【解决方案2】:

如果您的DFA 类扩展了Graph,那么它必须维护Graph 的合同。因此,如果您需要降低方法的可见性(如您所说,在 Java 中不可能),您需要打破 GraphDFA 的合同,因此,DFA 不应该是 @ 的孩子987654327@.

另一种说法是DFA 不能有Nodes,那么DFA 就不是Graph

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

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

【讨论】:

  • 现在很有趣:DFA 不是图,它有图
  • 已编辑:DFA 不是图,它是可以使用图表示的状态机。我不是计算机科学家,但我认为这是正确的
  • 好的,100% 正确。 DFA是一个可以用图来表示的概念。也可以用转换表来表示。但不知道Graph表示的是否也可以称为包含Graph
猜你喜欢
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
相关资源
最近更新 更多