我有16个方法接受两个参数,这两个参数中的每一个都可以是'Insertion'或'Deletion',它们都实现了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)
答案 0 :(得分:0)
我已经实施了DynamicDispatcher.cs来满足这一需求。
它使用反射和堆栈跟踪(构造中的单个跟踪)来通过参数类型生成重载树。它处理基类和实现接口的双向转换。
由于它是较大项目的一部分,并且没有任何文档,因此以下是一个示例用法(from the same project):
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);
}
答案 1 :(得分:-2)
首先,你不能用一个对象来调用一个方法,这些对象的派生程度较低&#34;因为您正在调用的方法正在等待此类型的最低要求。
对于这类问题,我认为只为该功能使用不同的名称会更好。 &#34; IntroduceAntecedent&#34;应该与&#34; IntroduceAntecedent_DelDel&#34;和所有其他3个组合。这显然是我自己的看法,但你做的方式似乎可以满足你的期望。