【问题标题】:How to avoid type-checking parameters in this scenario在这种情况下如何避免类型检查参数
【发布时间】:2020-08-13 16:40:36
【问题描述】:

我想实现一个基本的 Graph 结构,以后可以将其扩展到更具体的 Graph 类型(对话、行为...),每个都需要从 Node 基类派生的特定类型的节点。
我的 Graph 基类现在看起来像这样

public abstract class Graph {

  private Dictionary<Node, List<Node>> adjList;
  
  public abstract void AddNode(Node node);
  public abstract void RemoveNode(Node node);
  public abstract void AddEdge(Node node, Node destNode);
  public abstract void RemoveEdge(Node node, Node destNode);

}

我的问题是我必须在这些方法的实现中进行类型检查,以防止用户将 DialogueNode 添加到 QuestGraph。有什么设计模式可以解决这个问题吗?还是我应该不使用基类并多次编写一些代码?

【问题讨论】:

    标签: java inheritance design-patterns polymorphism typing


    【解决方案1】:

    我的问题是我必须在执行中进行类型检查 那些阻止用户添加的方法,例如, DialogueNode 到 QuestGraph。

    您可以定义一个抽象的泛型类并为每个实现指定一个特定的 Node 子类型。

    例如在 Java 中:

    public abstract class Graph<T extends Node> {
    
      private Dictionary<T, List<T>> adjList;
      
      public abstract void AddNode(T node);
      public abstract void RemoveNode(T node);
      public abstract void AddEdge(T node, T destNode);
      public abstract void RemoveEdge(T node, T destNode);
    }
    

    QuestGraph 子类可能是这样的:

    public class QuestGraph extends Graph<QuestNode> {
      public void AddNode(QuestNode node){...}
      public void RemoveNode(QuestNode node){...}
      // And so for ...
    }
    

    有什么设计模式可以解决这个问题吗?

    设计模式不强制执行这种规则,并且通常不是为了限制多态能力而设计的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      相关资源
      最近更新 更多