我有16个使用两个参数的方法,每个参数都可以是“插入”或“删除”,这两个参数都实现了IFragment。我还有四个像这样的助手函数:
static IFragment[] IntroduceAntecedent(IFragment on, IFragment item) {
bool onIsInsertion = on is Insertion;
bool itemIsInsertion = item is Insertion;
if (onIsInsertion) {
if (itemIsInsertion) {
return IntroduceAntecedent((Insertion) on, (Insertion) item);
} else {
return IntroduceAntecedent((Insertion) on, (Deletion) item);
}
}
else {
if (itemIsInsertion) {
return IntroduceAntecedent((Deletion)on, (Insertion)item);
} else {
return IntroduceAntecedent((Deletion)on, (Deletion)item);
}
}
}它只会确定实际类型并调用适当的重载。有更干净的方法吗?换句话说,我可以用派生较少类型的对象来调用函数的更多派生重载吗?
编辑: IntroduceAntecedent重载的签名
static IStringTransform[] IntroduceAntecedent(Deletion lhs, Deletion rhs)
static IStringTransform[] IntroduceAntecedent(Deletion lhs, Insertion rhs)
static IStringTransform[] IntroduceAntecedent(Insertion lhs, Deletion rhs)
static IStringTransform[] IntroduceAntecedent(Insertion lhs, Insertion rhs)发布于 2015-03-21 22:41:02
我已经实现了DynamicDispatcher.cs,它满足了这个需求。
它使用反射和堆栈跟踪(在构造中使用一个堆栈跟踪)根据参数类型生成重载树。它处理基类上的双向转换并实现接口。
由于它是大型项目的一部分,并且没有任何文档,下面是一个示例使用(来自同一个项目):
public static void DeleteTreeNodeChild(BehaviorTree.Choice parentNode, BehaviorTree.Node childNode) {
parentNode.Children.Remove(childNode);
}
public static void DeleteTreeNodeChild(BehaviorTree.Optional parentNode, BehaviorTree.Node childNode) {
Debug.Assert(parentNode.Child == childNode);
parentNode.Child = null;
}
public static void DeleteTreeNodeChild(BehaviorTree.Repetition parentNode, BehaviorTree.Node childNode) {
Debug.Assert(parentNode.Child == childNode);
parentNode.Child = null;
}
public static void DeleteTreeNodeChild(BehaviorTree.Sequence parentNode, BehaviorTree.Node childNode) {
parentNode.Children.Remove(childNode);
}
private static DynamicDispatcher _deleteTreeNodeChildDynamicDispatcher;
public static void DeleteTreeNodeChild(BehaviorTree.Node parentNode, BehaviorTree.Node childNode) {
if (_deleteTreeNodeChildDynamicDispatcher == null) {
_deleteTreeNodeChildDynamicDispatcher = new DynamicDispatcher();
}
_deleteTreeNodeChildDynamicDispatcher.Dispatch<Object>(null, parentNode, childNode);
}发布于 2014-09-17 02:55:58
首先,您不能使用“派生较少”的对象调用方法,因为您正在调用的方法正在等待该类型的最低要求。
对于这种类型的问题,我认为最好用不同的名称来表示这个函数。"IntroduceAntecedent“应该与"IntroduceAntecedent_DelDel”和所有其他三种组合一起存在。这显然是我自己的观点,但你的做法似乎可以满足你的期望。
https://stackoverflow.com/questions/25881394
复制相似问题