【发布时间】:2014-07-27 09:06:37
【问题描述】:
这篇文章的底部是一个解决方案的示例,尽管该示例显然是无效的,因为它在继承时使用了 BaseNode 和 BaseEdge 而没有提供类型。
我正在尝试创建一个抽象图类,其中节点类和边类也必须是抽象的。每个类的单独实现将添加方法和属性以及从基类实现抽象方法。
我有一个现有的解决方案,它只对所有内容使用基本类型,但是我很快发现自己陷入了混乱。
只有图类必须公开,尽管其他类可以公开,因此涉及节点和边类嵌套在图类中的解决方案是可以接受的。
有没有什么方法可以构造成所有属性都是正确的类型,而不需要在系统中的任何地方进行昂贵的强制转换?更重要的是实现类不必到处强制转换,但在这种情况下性能绝对是一个问题(实际上是),所以我宁愿完全避免强制转换。
abstract class Graph<TNode, TEdge>
where TNode : BaseNode<TEdge>
where TEdge : BaseEdge<TNode>
{
TNode root;
List<TNode> nodes;
List<TEdge> edges;
public abstract float process();
}
abstract class BaseNode<TEdge>
// THIS HERE IS THE PROBLEM
where TEdge : BaseEdge
{
List<TEdge> inputs;
public List<TEdge> Inputs
{
get
{
return inputs;
}
}
public abstract float process();
}
abstract class BaseEdge<TNode>
// THIS HERE IS THE PROBLEM
where TNode : BaseNode
{
TNode from;
TNode to;
public TNode To
{
get
{
return to;
}
}
public TNode From
{
get
{
return from;
}
}
public abstract float process();
}
@Marceln 想看看我现有的实现,所以就在这里。没有泛型也是一样的。
abstract class Graph
{
BaseNode root;
List<BaseNode> nodes;
List<BaseEdge> edges;
public abstract float process();
}
abstract class BaseNode
{
List<BaseEdge> inputs;
public List<BaseEdge> Inputs
{
get
{
return inputs;
}
}
public abstract float process();
}
abstract class BaseEdge
{
BaseNode from;
BaseNode to;
public BaseNode To
{
get
{
return to;
}
}
public BaseNode From
{
get
{
return from;
}
}
public abstract float process();
}
Node 的实现可能如下所示:
class ImplementedNode : BaseNode
{
public override float process()
{
foreach (ImplementedEdge edge in this.Inputs)
{
// Something
}
}
public bool getImplementationSpecificInfo()
{
return true;
}
}
【问题讨论】:
-
谢谢@marceln。您是指现有的解决方案吗?还是一个实现的例子?
-
对你来说更容易的。只要问题存在,一个例子就可以了。
-
对不起,如果我很厚实并且不理解@marceln,但我不完全确定您需要哪些额外信息。包含的代码中存在问题,因为行
where TEdge : BaseEdge和where TNode : BaseNode无效,因为 BaseEdge 和 BaseNode 是泛型类型,但不能以BaseNode<THIS_GENERIC_EDGE_TYPE>的形式使用。 -
哦,谢谢@Sahuagin 的标签。
-
我现在按照@marceln 的要求添加了另一个示例。
标签: c# .net generics polymorphism graph-theory