0

ネストされたクラスとサブクラスの関係に問題があります。次のコードを検討してください。

class Graph {
  class Edge {
    ...
  }

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

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

問題は、WeightedGraph のメソッドを記述するときに、_edges にアクセスできないことです。エディターは、タイプ Edge から WeightedEdge に変換できないと言っています。Graph では Edge 型を使用し、WeightedGraph では WeightedEdge 型を使用する必要があるため、ネストされたクラス Vertex も拡張する必要があると思います。これを行うにはどうすればよいでしょうか (コードを最初から書き直す必要はありません)。

4

2 に答える 2

2

_edgesのメンバーとして宣言されましたGraph.VertexVertexまたはそのサブクラスのみがそのメンバーを持ちます。クラスにそれを持たせたい場合は、サブクラスVertexも作成する必要があります。

編集: co と contravariance で、追加の問題があるようです。問題は、基本クラスがジェネリック型のリストを含むように宣言されていること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 に答える