2016-08-17 114 views
1

类框架:Java:如何在接口中调用实现类的元素?

public class Tree<AnyType extends Comparable <? super AnyType>> { 
    private static class BinaryNode<AnyType>{} 

    private BinaryNode<AnyType> root; 
    public Tree(){} 
    public void makeEmpty(){} 
    public boolean isEmpty(){ 
     /*code*/ 
    } 
    public boolean contains(AnyType x){ 
     /*code*/ 
    } 
    public boolean contains(AnyType x, BinaryNode<AnyType> node){ 
     /*code*/ 
    } 
} 

我想创建一个接口,但BinaryNode是私有的:

public interface TreeFramework<AnyType> { 
    public void makeEmpty(); 
    public boolean isEmpty(); 
    public boolean contains(AnyType x); 
    public boolean contains(AnyType x, BinaryNode<AnyType> e); //fail 
} 

我一定要建立一个公共BinaryNode类?

+0

让我们退一步:为什么要创建这样一个接口? BinaryNode的要点是:它是该实现的内部细节;显然不意味着在课外使用?那么,你的界面中第四种方法的目的是什么? – GhostCat

+0

我想你误解了接口的使用。一般来说,你不应该在你的界面中需要'BinaryNode'。 –

+0

@GhostCat我想知道是否存在类似'super'的调用。树主要是因为BinaryNode。 – zhanzezhu

回答

1

我看到的问题是,您正在收到编译器错误,因为客户端代码无法找到任何要导入的BinaryNode类。您始终可以接受普通的旧版本java.lang.Object,并使用Object#equals()方法来确定与大多数标准库集合相同的平等。

看看您的界面设计,我没有看到客户端代码如何访问Tree类中的BinaryNode引用。除非此接口不完整,否则在contains方法中公开BinaryNode类对于潜在客户端来说似乎没有多大作用。

+0

谢谢你的回答。如果我删除** private **,则成为'public boolean contains(AnyType x,Tree.BinaryNode e);'不? – zhanzezhu

+0

你想在这里完成什么?我没有看到返回BinaryNode的方法。只要代码没有对BinaryNode的引用,客户端代码就不会发现这个接口有用。如果有方法,我会建议创建一个单独的文件与一个简单的骨头接口。随着向这些类添加新功能,这使得代码可以很容易地增长。 –