如何递归分配属性?

时间:2018-04-11 18:23:03

标签: c# inheritance recursion

我在这里有一个基础抽象类:

SELECT * 
FROM #temptable 
WHERE Reason_Comment != 'Paid In FUll'  AND trans_code != 'X'

SELECT * 
FROM #temptable 
EXCEPT
SELECT * 
FROM #temptable 
WHERE Reason_Comment = 'Paid In FUll'
OR trans_code = 'X'

我有两个派生于

的课程
public abstract class Group
{  
  public ParentGroup { get; set; }
}

因此,这两个类都可以访问ParentGroup属性。

我试图以递归方式为每个派生类分配ParentGroup属性。需要注意的是,GroupB有一个List组件,可以容纳Group类型的元素。

public class LeafA : Group
public class GroupB : Group

这是我试图以递归方式分配ParentGroup

的方法
public List<Group> Groups { get; set; }

这只是一个示例,但如果我的GroupB GroupElement在组中有两个元素:1是GroupB,另一个是LeafA。 GroupB可以容纳x个Group,所以我想递归遍历所有这些子组并分配ParentGroup。 ParentGroup类似于 - &gt;

private void AssignParentGroup(GroupB GroupElement)
{
  foreach (Group component in GroupElement.Groups)
  {
    if (component is GroupB)
     {
       // Recursive call here
      }
    }
  }

希望这很清楚。如果我能解释,请告诉我。

2 个答案:

答案 0 :(得分:3)

你可能正在寻找类似的东西:

private void AssignParentGroup(Group groupElement, Group parentGroup)
{
    // the groupElement has always a ParentGroup property. assign it.
    groupElement.ParentGroup = parentGroup;

    // if the class is a GroupB, then is has subGroups. Pass the groupElement as parent.
    if(groupElement is GroupB groupB)
        foreach(var subGroup in groupB.Groups)
            AssignParentGroup(subGroup, groupElement);
}

称之为:

AssignParentGroup(someGroup, null);

或者为第一次通话设置parentGroup参数默认null

private void AssignParentGroup(Group groupElement, Group parentGroup = null)

您可以扩展此代码,并检查在LeafA

时要执行的操作

答案 1 :(得分:0)

我会通过实现访问者模式来解决这个问题。

首先,我将accept方法添加到我的抽象类中。

public abstract class Group
{
    public Group ParentGroup { get; set; }
    public abstract void Accept(GroupVisitor visitor);
}

我将为派生类实现样板文件。

public class LeafA : Group {
    public override void Accept(GroupVisitor visitor){
        visitor.Visit(this);
    }
}
public class GroupB : Group
{
    public List<Group> Groups {get;set;}
    public override void Accept(GroupVisitor visitor) {
        visitor.Visit(this);
    }
}

然后像这样实现组访问者:

public class GroupVisitor {
    private Group _parent;
    public GroupVisitor(Group parent) {
        _parent = parent;
    }

    public void Visit(LeafA leaf) {
        leaf.ParentGroup = _parent;
    }

    public void Visit(GroupB group) {
        group.ParentGroup = _parent;
        var visitor = new GroupVisitor(group);
        foreach (var item in group.Groups)
            item.Accept(visitor);

    }
}

因此,我们可以将父级分配给组层次结构,如下所示:

var visitor = new GroupVisitor(someGroup.ParentGroup);
someGroup.Accept(visitor);

这将同时处理父母与LeafA以及GroupB的分配。