调用基于矩阵行和col索引的唯一函数
有三个视图
ViewA
ViewB
ViewC
用户可以从ViewX
切换到ViewY
。从X到y有不同的转换方式,例如从a到B要经过一条路,而从B到a要经过另一条路。
我正试图为它写一个泛型函数。根据我的理解,这三种观点总共有6种组合(a - b, a - c, B-A, B-C, C-A, C-B)
ViewA ViewB ViewC
ViewA X 2 3
ViewB 4 X 6
ViewC 7 8 X
我想的是,我将注册特定的函数来给定移动。例如,如果移动是从ViewA到ViewB,那么我将注册函数SwitchViewA_to_viewB()
到第二个索引。
这就是调度表
my %switchers = (
ViewA => { ViewB => &SwitchViewA_to_viewB,
ViewC => &SwitchViewA_to_viewC, },
ViewB => { ViewA => &SwitchViewB_to_viewA,
ViewC => &SwitchViewB_to_viewC, },
ViewC => { ViewA => &SwitchViewC_to_viewA,
ViewB => &SwitchViewC_to_viewB, },
);
$switchers{$from}{$to}->()
if $from ne $to;
或
my %switchers = (
"ViewA-ViewB" => &SwitchViewA_to_viewB,
"ViewA-ViewC" => &SwitchViewA_to_viewC,
"ViewB-ViewA" => &SwitchViewB_to_viewA,
"ViewB-ViewC" => &SwitchViewB_to_viewC,
"ViewC-ViewA" => &SwitchViewC_to_viewA,
"ViewC-ViewB" => &SwitchViewC_to_viewB,
);
$switchers{"$from-$to"}->()
if $from ne $to;
请注意,您可以通过在父类中传递参数来传递给函数(像往常一样)。
如果你有10个视图,那就意味着你有90个函数。
你确定你要这样处理这个问题吗?您也许应该考虑一种不需要了解前一个视图的方法。也许每个视图可以有两个函数。一个用来激活视图,另一个用来取消激活。
那么你只需要20个函数而不是90个。添加第十一个视图只需要编写2个函数,而不是20个。
在Java中,你可以创建"function"对象,将它们存储在一个集合中(例如map of maps),为你拥有的组合获得相应的一个并执行。
函数接口,实际函数实现如下:
interface SwitchViewFunction() {
void switchView(View from, View to);
}
在你的视图切换代码中:
Map<View,Map<View,SwitchViewFunction>> map = ...;
map.get(from).get(to).switchView(from, to);
请注意,在上面的代码中没有检查(例如null等),这些都留给您作为练习。
还请注意,要使用View
作为键,它应该有hashCode()
和equals(...)
的合理实现。