gpt4 book ai didi

c# - 是否可以从递归生成的类继承?

转载 作者:行者123 更新时间:2023-12-01 19:01:02 24 4
gpt4 key购买 nike

我有一个进行嵌套分组的类。简化形式如下。

public class Group
{
public readonly object Key;
public readonly IEnumerable<Group> Groups;
public readonly IEnumerable<DataRow> Drs;

public Group(object key, IEnumerable<DataRow> source, List<string> columnList)
{
Key = key;

if (columnList.Count == 0)
Drs = source;
else
{
string firstColumn = columnList.First();
List<string> restOfColumns = columnList.Skip(1).ToList();

Groups = source.GroupBy(dr => dr[firstColumn])
.Select(g => new Group(g.Key, g, restOfColumns));
}
}
}

这在某种程度上是没问题的。但有时我需要这个类的更多属性(和方法)。同时我不想将这些属性添加到此类中,因为这会破坏简单性,并且大多数用法不会对这些属性感兴趣。因此我尝试从这个类继承。

public class SpecialGroup:Group
{
public SpecialGroup(object key, IEnumerable<DataRow> source, List<string> columnList)
: base(key, source, columnList)
{
}

public void DoSomething()
{
// do something
}
}

但是这次 SpecialGroup 没有递归生成(如预期)。只有第一个主组是SpecialGroup,嵌套组都是Group

我可以通过某种方式从 Group 继承并仍然对新类型进行递归吗?

(请不要使用扩展方法,因为这与在 Group 类中编写所有方法没有什么不同)

最佳答案

您可以更改组多态的创建。例如:

public class Group
{
public readonly object Key;
public readonly IEnumerable<Group> Groups;
public readonly IEnumerable<DataRow> Drs;

public Group(object key, IEnumerable<DataRow> source, List<string> columnList)
{
Key = key;

if (columnList.Count == 0)
Drs = source;
else
{
string firstColumn = columnList.First();
List<string> restOfColumns = columnList.Skip(1).ToList();

Groups = source.GroupBy(dr => dr[firstColumn])
.Select(g => CreateGroup(g.Key, g, restOfColumns));
}
}

protected virtual Group CreateGroup(object key, IEnumerable<DataRow> source, List<string> columnList)
{
return new Group(key, source, columnList)
}
}

然后在您的 SpecialGroup 中覆盖它以返回 SpecialGroup

public class SpecialGroup:Group
{
public SpecialGroup(object key, IEnumerable<DataRow> source, List<string> columnList)
: base(key, source, columnList)
{
}

public void DoSomething()
{
// do something
}

protected override Group CreateGroup(object key, IEnumerable<DataRow> source, List<string> columnList)
{
return new SpecialGroup(key, source, columnList)
}
}

这样,如果您的根组的类型为 SpecialGroup,则其子组的类型将为 SpecialGroup,否则为 Group

关于c# - 是否可以从递归生成的类继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27019084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com