调用基于矩阵行和col索引的唯一函数



调用基于矩阵行和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()到第二个索引。

请让我知道我们是否有其他更好的方法来实现它。这只是一个三视图的例子。在我的实际案例中,我有将近10个这样的视图。

这就是调度表

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(...)的合理实现。

最新更新