【问题标题】:Using an Interface in Java在 Java 中使用接口
【发布时间】:2014-10-06 11:52:56
【问题描述】:

好吧,我有一个相当简单的问题,但我似乎无法找到解决办法......

对于一个类,我必须为具有如下方法的二叉树实现一个接口:

public List<Node<E>> listAll();

我们需要有一个名为 MyNode.java 的类,我用它来制作我的树。所以列出所有我认为我会这样做的孩子:

public List<Node<E>> listAll(){
    List<Node<E>> childList = new ArrayList<>();
    MyNode<E> thisNode = this.l;

    while(thisNode!= null){
        childList.add(thisNode);
        thisNode = thisNode.l;
    }

    return childList;
 }

并做一些事情,比如设置一个孩子

public void setChild(Node<E> child){
    E elem = child.getElement();
    MyNode<E> newNode = new MyNode(elem);
    this.l = newNode;
}

所以我的问题是:我这样做对吗?如果我尝试创建一个节点,我不能,因为我的节点被称为 MyNodes 但是当我尝试创建一个 MyNodes 列表并返回它们时,它会给我一个错误,因为我没有遵循界面。当我尝试制作该方法接受 MyNode 而不是 Node 它说我没有遵循界面。下面再澄清一点..

我目前正在使用 implements 声明来实现 Node.java 接口。当我编写接口指定的方法时:

public void setChild(Node<E> child);

那么我目前正在充实该方法:

public void setChild(Node<E> child) {
    E elem = child.getElement();
    MyNode<E> newNode = new MyNode<E>(elem);
    MyNode<E> transNode = this.l;
    if(transNode!=null){
        while(transNode.r!=null){
            transNode = transNode.r;
        }
        transNode = newNode;
    }
    else transNode = newNode;
}

你可以看到我是如何从输入子元素中获取元素并从中创建一个新的 MyNode 以作为新子元素放置的,而不是仅仅将 Node 注入到我的树中。这是错误的吗?我似乎找不到其他工作方式...

【问题讨论】:

    标签: java interface tree


    【解决方案1】:

    接口有助于使代码通用。如果您想拥有一个 Node 类的多个实现,每个实现都具有相同的方法,那么制作一个接口将是一个好主意。

    或者,如果您想强制执行 API 以供其他人使用,那么接口是执行此操作的正确方法。您可以创建接受任何实现该接口的对象的方法。

    如果您只是为简单的二叉树实现创建一个 Node 类,那可能没有意义。您的二叉树可能希望实现一个 Collection 接口以使其可用作通用结构。

    如果您想在开始之前将自己与 API 签约,那么接口可能是实现此目的的好方法。

    【讨论】:

      【解决方案2】:

      一般来说,您不想创建接口,除非您想要一个抽象,您实际上将编写该抽象的不同实现。在您的情况下,class Node&lt;T&gt; 足以满足您的需求。

      【讨论】:

        【解决方案3】:

        通常认为使用 API 的接口是好的形式。
        简而言之,这样做:

        • 允许调用者提供他们喜欢的任何实现
        • 使测试更容易,尤其是在使用模拟时
        • 在石头中凿出最少的 API

        Liskov substitution principle

        【讨论】:

          猜你喜欢
          • 2017-11-25
          • 1970-01-01
          • 1970-01-01
          • 2013-10-23
          • 2017-05-16
          • 2011-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多