Tôi có một ứng dụng thực hiện các thuật toán phân tích khác nhau trên đồ thị của các nút và các cạnh G (N, E). Các thuộc tính của các nút và các cạnh khác nhau với ứng dụng và tạo thành một hệ thống phân cấp thừa kế dựa trên loại biểu đồ và bản chất của các thuộc tính. Ví dụ, thư mục gốc của hệ thống phân cấp Node có thể đại diện cho các đồ thị Cyclic không theo định hướng chung nhất (NcgNode). Một lớp con của NcgNode có thể đại diện cho các đồ thị theo chu kỳ trực tiếp (DcgNode), tiếp theo là DagNode, vv Các thuật toán có thể áp dụng cho DAG khác với NCG, nhưng không phải là thị thực. Một hành vi quan trọng của thư mục gốc của cây là thêm và lấy các nút liền kề của biểu đồ. Câu hỏi đặt ra là làm thế nào để làm điều này mà không tạo ra một ngoại lệ "không được kiểm soát"?Thừa kế và generics
Một phiên bản ngắn gọn của mã có thể trông như thế này:
import java.util.ArrayList;
import java.util.List;
public class NcgNode {
private List<NcgNode> nodeList_ = null;
private List<? extends NcgNode> nodeListSrc_ = null;
private List<? super NcgNode> nodeListSink_ = null;
public <N extends NcgNode> void addNode(N node) {
if (nodeList_ == null) {
nodeList_ = new ArrayList<NcgNode>();
nodeListSrc_ = nodeList_;
nodeListSink_ = nodeList_;
}
nodeListSink_.add(node);
}
@SuppressWarnings("unchecked")
// Any way to avoid this?
public <N extends NcgNode> N getNode(int n) {
if ((nodeList_ == null) || (n >= nodeList_.size()))
return null;
// causes unchecked warning:
return (N) nodeListSrc_.get(n);
}
}
class DcgNode extends NcgNode {
// enables DCG algorithms, etc
}
class DagNode extends DcgNode {
// enables DAG algorithms, etc.
}
Có cách nào tốt hơn để thiết kế này?
Giải pháp này không cho phép người gọi sử dụng các chi tiết cụ thể của lớp con cụ thể mà nó trả về mà không thực hiện một diễn viên không an toàn. Đánh lừa lon có thể xuống đường. –