C# 处理泛型子类(作为基类引用)上的操作,而不添加不合理的混乱
我有一个类,用于表示标记树结构中的节点,该树结构由字符串标签、对节点父级的引用和节点子体数组组成。节点有一个函数C# 处理泛型子类(作为基类引用)上的操作,而不添加不合理的混乱,c#,generics,C#,Generics,我有一个类,用于表示标记树结构中的节点,该树结构由字符串标签、对节点父级的引用和节点子体数组组成。节点有一个函数Combine,它将另一个节点作为参数,并根据标签返回两棵树的并集 class Node { string name; Node parent; Node[] descendants; //various functions public Node Combine(Node B){...} } 除了这些节点已有的标签外,我还希望能够将值绑定
Combine
,它将另一个节点作为参数,并根据标签返回两棵树的并集
class Node
{
string name;
Node parent;
Node[] descendants;
//various functions
public Node Combine(Node B){...}
}
除了这些节点已有的标签外,我还希望能够将值绑定到这些节点,并使组合函数也作用于这些值(例如,标记为“a”且值为“6”的节点将组合成标记为“a”且值为“6,34”)的节点“。某些节点不应将值绑定到它们,并且将它们与值节点组合会导致节点结转。值应能够具有各种类型,类型不匹配可能由相关类型处理,也可能在运行时引发类型错误。我首先尝试通过使用值的字节数组并解析每当我想用它们做任何事情时,都可以使用e数组,但在我看来,在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; }
}
抽象类节点值
{
公共抽象子组合(子B){…}
}
类节点:其中T:NodeValue的节点
{
T值;
公共节点(T val):base(){value=val;}
}
撇开NodeValue
的丑陋不谈,我不知道如何正确定义Combine函数。实现它的明智方法是递归的,这要求所有节点都被引用为节点。仅将Combine
虚拟化是不够的,因为它仍然会返回一个节点而不是节点e
我需要。添加一个将节点
返回到Node类的组合
函数需要我提前知道我使用的是节点
还是节点
,这需要昂贵的反射或复杂且容易出错的伪变量系统,或者使用处理节点
、节点
和节点
输入的不同参数,所有这些参数(以及原始组合)都需要在节点
中重写,从而产生八个几乎相同但并不完全相同的方法,其中一个方法就足够了
我是否遗漏了一些关于泛型如何实现的内容?我很确定泛型属性/字段是不允许的,这是我真正想要的,但我想,是否有一些与它们等效的功能可以使用?嗯,我找到了一种更干净的解决方法,尽管不是完美的,使用委托和抽象类,但没有泛型
定义节点
和节点值
,如下所示:
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[]
方法可以将其与其他可用类型进行比较,并适当地返回其他可用类型。为什么Node
首先不是泛型的?同一棵树中是否有具有不同类型值的节点?如果是这样,就不能用纯泛型来解决这个问题。我确实希望在同一棵树中有不同类型的值,并且很快就会得到解决同意你的最后一句话。我本希望对类型的定义进行非定域化,但看起来这不会发生。。。