gpt4 book ai didi

java - 关于固定类双重调度的问题

转载 作者:行者123 更新时间:2023-11-29 09:19:06 24 4
gpt4 key购买 nike

我有 3 个类(class):**Parent**、**Child1** 和 **Child2**。 Child1 和 Child 2 都扩展了 Parent 并且它们**不能**被修改。

有一个Action类定义如下:

public class Action {
public static void perform(Parent p) {
if (p instanceof Child1) {
action((Child1)p);
}
else if (p instanceof Child2) {
action((Child2)p);
}
else {
action(p);
}
}

private static void action(Parent p) {
...
}
private static void action(Child1 c1) {
...
}
private static void action(Child2 c2) {
...
}
}


Parent p = new Child1();
Action.perform(p);

如果没有 instanceof 运算符,是否有任何方法可以获得与上述相同的行为?

======
(修改)

PS:Action.perform给定的参数类型是Parent,但是它的值是Child1,所以我觉得方法重载不行....

最佳答案

这里有两个 C# 解决方案,一个基本相同但更简洁,适合子类数量较少的情况。

public class Parent
{
}

public class Child1 : Parent
{
}

public class Child2 : Parent
{
}

public class Action
{
private static Dictionary<Type, Action<Parent>> _d = new Dictionary<Type, Action<Parent>>()
{
{typeof(Child1), p=>action((Child1)p)},
{typeof(Child2), p=>action((Child2)p)},
{typeof(Parent), p=>action(p)}
};
public static void perform(Parent p)
{
_d[p.GetType()](p);
}

private static void action(Parent p)
{

}

private static void action(Child1 c1)
{

}
private static void action(Child2 c2)
{

}
}



class Program
{
static void Main(string[] args)
{
Parent p = new Child1();
Action.perform(p);
}
}`enter code here`

无论如何,它打破了 OCP,但比使用反射更快。这个不破坏OCP但使用反射来填充字典:

public class Action
{
private static Dictionary<Type, Action<Parent>> _d;

static Action()
{
Initialize();
}

private static void Initialize()
{
var methods = typeof(Action)
.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
.Where(IsActionMethod)
.ToList();

_d = methods.ToDictionary(m => m.GetParameters().First().ParameterType,
m => (Action<Parent>) (x => m.Invoke(null, new[] {x})));
}

private static bool IsActionMethod(MethodInfo methodInfo)
{
var parameters = methodInfo.GetParameters();

return parameters.Length == 1
&& typeof(Parent).IsAssignableFrom(parameters.First().ParameterType)
&& methodInfo.ReturnType == typeof(void);
}

public static void perform(Parent p)
{
_d[p.GetType()](p);
}

private static void action(Parent p)
{

}

private static void action(Child1 c1)
{

}

private static void action(Child2 c2)
{

}
}

关于java - 关于固定类双重调度的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7556892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com