gpt4 book ai didi

c# - 处理通用子类上的操作,引用为基类,而不会增加不合理的困惑

转载 作者:太空宇宙 更新时间:2023-11-03 15:23:34 24 4
gpt4 key购买 nike

我有一个类,用于表示带标签的树结构中的节点,该树结构由字符串标签、对 Node 父节点的引用和 Node 后代数组组成。节点有一个函数 Combine根据标签,它以另一个节点作为参数并返回两棵树的并集。

class Node
{
string name;
Node parent;
Node[] descendants;

//various functions

public Node Combine(Node B){...}
}

我希望能够将值绑定(bind)到这些节点,除了它们已经具有的标签之外,并且让 Combine 函数也作用于这些值(例如,标记为“A”且值为“< 34' 和另一个标记为 'A' 且值为 '>6' 的节点将组合成一个标记为 'A' 且值为 '(6, 34)' 的节点。一些节点不应该将值绑定(bind)到它们,并将它们与值组合node 应该导致节点结转。值应该能够有各种类型,类型不匹配要么由相关类型处理,要么在运行时抛出类型错误。我首先尝试通过为值使用字节数组来做到这一点并在我想对它们执行任何操作时解析数组,但在我看来,在 C# 中执行此操作的更好方法是使用如下所示的通用抽象类:

abstract class NodeValue<Sub>
{
public abstract Sub Combine(Sub B){...}
}

class Node<T>:Node where T:NodeValue<T>
{
T value;
public Node<T>(T val):base() { value = val; }
}

丑陋的NodeValue<Sub>除此之外,我不知道如何正确定义 Combine 函数。实现它的明智方法是递归,这需要所有 Node<T>被引用为节点。制作Combine virtual 本身是不够的,因为它仍然会返回一个 Node 而不是 Node<T>我需要。添加 Combine<T>返回 Node<T> 的函数到 Node 类需要我提前知道我是否正在使用 NodeNode<T> ,这需要昂贵的反射或复杂且容易出错的虚拟变量系统,或者使用不同的参数制作几乎相同的函数来处理 Node , Node<T>Node<S != T>输入,所有这些(以及原始的 Combine)都需要在 Node<T> 中被覆盖, 导致八种几乎但不完全相同的方法,其中一种方法确实应该足够了。

我是否遗漏了一些关于如何实现泛型的信息?我很确定通用属性/字段是不允许的,这是我真正想要的,但是否有一些与它们等效的功能我可以使用?

最佳答案

好吧,我找到了一个更简洁但不完美的变通方法,它使用委托(delegate)和抽象类,但没有泛型。

定义NodeNodeValue如下:

class Node
{
string name;
Node parent;
Node[] descendants;
NodeValue val;

...

Node Combine(Node B)
{
Node C = new Node();
C.name = name;
C.val = val.Combine(B.val);
...
}
}

delegate NodeValue comb(NodeValue B);

abstract class NodeValue
{
protected readonly int index;
public comb[] Combinations;

public NodeValue(int ind, comb[] combs)
{
index = ind;
Combinations = combs;
}

public NodeValue Combine(NodeValue B)
{
if (B.index > Combinations.Length)
{
return null; //could alternately throw an exception, depending on the desired behavior.
}
return Combinations[B.index](B);
}
}

NodeValue 的子类应该具有针对特定索引 n 实现 base(n, combs[]) 的构造函数,与实例保持不变例如,应该使用将其与其他可用类型进行比较并适当返回其他可用类型的方法来填充 combs[]

关于c# - 处理通用子类上的操作,引用为基类,而不会增加不合理的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36290248/

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