2012-03-22 111 views
1

我有一个基类和一个名为Node的派生类,它们构成一个Graph的元素。 我想定义一个DerivedGraph,它只能存储DerivedNodes,并且可能有一些DerivedNode特定的方法。这两个节点必须是可变的。在派生类中处理派生成员的标准实践

处理这个问题的标准做法是什么? 重复数据成员显然是要避免的。 应该通过属性中的类型检查和投射来完成吗?

public class Node {} 
public class DerivedNode : public Node {} 

public class Graph 
{ 

    private List<Node> nodes; 

    //some code 
} 

class DerivedGraph : Graph {} 

编辑:

我要补充,我需要的是图形可以包含节点和DerivedNodes

回答

2

我会建议使用Generics来解决这个问题的功能。

public class Node {} 
public class DerivedNode : public Node {} 

public class Graph<T> where T : Node 
{ 

    private List<T> nodes; 

    //some code 
} 

class DerivedGraph : Graph<DerivedNode> {} 

这将允许您指定任何NodeDerivedNode实例化类时。

+0

你需要T是一个Node对象 – 2012-03-22 15:37:50

+0

@迈克尔将我仍然能够有一个包含节点和DerivedNodes的图形的约束? – gwizardry 2012-03-22 15:39:07

+0

@DaveS好主意......修正。 – 2012-03-22 15:39:15

0

也许做一个通用的Graph和扩展方法Graph其中T:DerivedNode?注意:刚进入我的脑海,还没有这样做。但是,这可以工作,并保持您的代码清洁。

您可以使Graph为通用并从Graph继承。所以,你会不会扩展方法

0

做正确的做法麻烦,是用一个通用Graph类,然后添加constraints on its typed parameter,以确保它是NodeNode派生:

public class Node {} 
public class DerivedNode : Node {} 

public class Graph<T : Node> // <<=== 
{ 
    private List<T> nodes; 
    //some code 
} 

class DerivedGraph : Graph<DerivedNode> {} 
+0

还没见过的语法是否与之前相同T:Node? – gwizardry 2012-03-22 15:37:34

0

你可以泛型;像

public class Graph<T> where T : Node 
{ 

    private List<T> nodes; 

    //some code 
} 

class DerivedGraph : Graph<DerivedNode> {} 
0

使用泛型:

public class Node 
{ 
} 

public class DerivedNode : Node 
{ 
} 

public class Graph<T> 
    where T : Node 
{ 
    private List<T> nodes; 

    //some code 
} 

public class DerivedGraph : Graph<DerivedNode> 
{ 
}