消除铸造的需要

时间:2015-11-19 13:18:19

标签: java interface

我正在忙着编写修改图表的API。为了控制我向API用户公开的内容,我正在使用接口。

公开将要使用的方法的接口如下。基本上这是用户将看到的:

public interface GraphEditor{
    Edge addEdge(AsbtractNode f, AbstractNode t)
}
public interface AbstractNode{
}
public interface ExampleNode1 extends AbstractNode{
}
public interface ExampleNode2 extends AbstractNode{
}

实施结构是:

public class GraphEditorImpl implements GraphEditor{
    public Edge addEdge(AsbtractNode f, AbstractNode t){
        AbstractNodeImpl from = (AbstractNodeImpl) f;
        AbstractNodeImpl t = (AbstractNodeImpl) f;
        from.getVertex().addEdge(t.getVertex);
    }
}
public class AbstractNodeImpl implements AbstractNode{
    Vertex vertex; //Must remain hidden from users
    public Vertex getVertex(){
        return vertex;
    }
}

内部图形编辑器我有一个方法允许用户在两​​个节点addEdge之间添加和边缘。此方法必须将AbstractNode转换为AbstractNodeImpl才能访问获取“顶点”所需的getVertex()方法。

我无法在getVertex()界面中公开AbstractNode,因为我无法让用户直接使用Vertex。有没有办法实现这种功能而无需从接口转换为实现?

3 个答案:

答案 0 :(得分:3)

您当前的型号不起作用。您可以使AbstractNode接口仅包含节点上的信息,GraphEditor接口包含编辑图形所需的所有方法:

interface AbstractNode {
    // identify this node
    // this class only contains the ID of this node
}

interface GraphEditor<T extends AbstractNode> {
    // this class stores the graph
    void addEdge(T a, T b);
}

答案 1 :(得分:1)

将函数addEdge(AbstractNode)添加到AbstractNode界面。

此函数的实现可以是getVertex().addEdge(that.getVertex)或适合实现类的任何内容。

如果您不希望别人能够访问Vertex个实例,请将getVertex()设为私有或受保护。

答案 2 :(得分:0)

使用类型作为参数并将其转换为方法内的不同子类型是一种糟糕的设计。

如果用户创建扩展AbstractNode的自定义类会怎样?

您还需要考虑编写API时。

如果没有其他可能性,您需要检查代码中参数的实际类型是否为AbstractNode,否则您需要至少抛出IllegalArgumentException