0

我在嵌套类和子类之间的关系方面遇到问题。考虑以下代码:

class Graph {
  class Edge {
    ...
  }

  class Vertex {
    List<Edge> _edges;
    ...
  }
  ...
}

class WeightedGraph extends Graph {
  class WeightedEdge extends Edge {
    ...
  }
  ...
}

问题是,在为 WeightedGraph 编写方法时,我无法访问 _edges;编辑说它不能从类型 Edge 转换为 WeightedEdge。我想我还必须扩展嵌套类 Vertex,因为在 Graph 中它使用 Edge 类型,而在 WeightedGraph 中它必须使用 WeightedEdge 类型。什么是这样做的好方法(无需重新编写代码)?

4

2 回答 2

2

您已_edges声明为 的成员Graph.Vertex。只有Vertex或其子类具有该成员。如果你想让你的类拥有它,你也需要子类Vertex

编辑:听起来你还有一个额外的问题,即 co 和逆变。问题是基类被声明为包含一个具有泛型类型的列表Edge。虽然您可以将它们存储WeigtedEdges在其中,但如果没有强制转换,您将无法将它们取回,因为编译器所知道的只是它包含常规Edges.

我不记得泛型的确切规则,但我相信这些方面的一些东西可能会有所帮助。或者,您可以硬着头皮添加额外的演员表。泛型的目的是帮助添加一些额外的编译时类型检查,但是当它妨碍时,你可以忽略它。唯一的风险是错误更容易溜进来,因为类型只会在运行时检查。

class Vertex <T extends Edge> {
    List<T> _edges;
    ...
  }

class WeightedVertex extends Vertex<WeightedEdge> {...}
于 2013-04-21T23:08:28.287 回答
0

您可以定义用于访问Vertexfrom的类字段的方法WeightedGraph

就像是:

class Graph
{
   ...
    protected List<Edge> getVertexEdges(Vertex v)
    {
        return v._edges;
    }
}

所以你可以在你的子类中使用这个助手

于 2013-04-21T23:11:23.820 回答