【发布时间】:2013-11-01 18:27:03
【问题描述】:
我的代码有一个小问题,我认为这很有趣:
foreach(ISceneNode node in (root as IGroupNode))
{
PreVisit(node);
if (notFound == false)
{
return node;
}
else
PostVisit(node);
}
我试图在 ISceneNode 对象节点上调用方法 PreVisit 和 PostVisit,它是其他类型节点的父类。但是,因为这是对象关系的“太笼统”,所以我不允许调用方法:
//methods
void PreVisit(IDrawableNode drawable)
{
string targetName = drawable.Name;
Boolean notFound = true;
CompareToTarget(targetName, notFound, drawable);
}
void PreVisit(ITransformNode transform)
{
string targetName = transform.Name;
Boolean notFound = true;
CompareToTarget(targetName, notFound, transform);
}
void PreVisit(IStateNode state)
{
string targetName = state.Name;
Boolean notFound = true;
CompareToTarget(targetName, notFound, state);
}
void PreVisit(IGroupNode group)
{
string targetName = group.Name;
Boolean notFound = true;
CompareToTarget(targetName, notFound, group);
}
IGroupNode、IStateNode 等都是从 ISceneNode 派生的……那为什么我不能只使用 ISceneNode 来调用这个重载方法呢?是因为它不知道选择哪种方法吗?如何在我的代码中解决这个问题并解决它?
【问题讨论】:
-
这称为多(或动态)分派。你需要一个访问者模式。
-
我确实有一个访客模式。
-
介意进一步解释吗?这实际上是 SearchVisitor 类的实现,它在这些节点的树上执行搜索。
-
如何将参数类型转换为所需类型? PreVisit(((IGroupNode)node));
-
如果你将
node设为动态类型变量,运行时会自动选择最匹配的重载,如果没有匹配则抛出异常:foreach (dynamic node in (group as IGroupNode))
标签: c# relationship downcast