我有一些构建多态对象树的代码(C#)。根据类型,对象可能有0-7个孩子。现在,对象的构造函数什么都不做,我使用递归辅助函数构造整个对象树:
// pseudocode
void BuildTree(Node root) {
if(root is A) {
root.a_data = ...
root.a_child = GenerateNewNode(some_constraints);
BuildTree(root.a_child)
} else if(root is B) {
// same stuff, for B. Note B may have different chldren, etc
}
}
这一切看起来都很不优雅,所以基本上我正在寻找一种可以帮助我的模式。 BuildTree功能似乎是某种策略,我希望将来能够使用不同的策略。
哦,另一个复杂的因素。 BuildTree中有些东西是以BuildTree早期的东西为条件的。例如,如果我曾经生成过B,那么我需要做XYZ到C节点。或者,如果我当前正在生成A的子项,则不要生成D。
答案 0 :(得分:0)
听起来你需要在每个节点上粘贴一个多态方法,这样每个节点都能够自我构建。
public class Node
{
public virtual BuildNode(IBuildStrategy strategy)
{
}
}
这样你就可以直接打电话了
root.BuildNode(new InitialNodeBuildingStrategy());
填充树,同时仍允许子树内的自定义策略。