使用单一方法的OO解决方案

时间:2010-12-10 05:14:22

标签: java oop

我将使用Java作为示例,但这个问题确实适用于所有OO语言:

假设我有几种不同的标签类型:例如研究,信息和帮助。根据需要,这些都放在JTabbedPane中。需要哪些标签会有所不同。当用户选择包含“研究”选项卡类型的选项卡时,需要运行setStandards()。其他选项卡类型不需要这样做。这可以通过两种方式实现:

if (pane instanceof Research) {
   (Research)pane.setStandards();
}

或在Info / Help类(或其父级)中实现空setStandards()方法。

第一种方法很丑陋,但我的问题是,是否可以使用空方法在不透明的情况下在任何标签上调用setStandards(),即使它什么都不做?这个占位符方法似乎有点傻。

3 个答案:

答案 0 :(得分:3)

你的第二种方法是两者中的更好,但更好的方法是使用类似tabSelected之类的方法。 “研究”选项卡的tabSelected方法将调用setStandards。其他选项卡在此方法中不执行任何操作。这样,它就是一种有意义的方法,即使它在某些类中没有任何作用。

答案 1 :(得分:0)

pane instanceof Research显然是一个坏主意,因为它破坏了封装(只有“研究”选项卡实现“setStandards()”泄漏到调用类中的知识)。

可能更好的方法是在超类中为所有选项卡定义一个通用的“tabWasSelected()”方法(它们都从单个父项继承,右:-),然后让每个选项卡类实现任何逻辑(例如“setStandards()”),当它被选中时需要发生。

另一个模型(至少在一些OO语言中)是让选项卡可选地实现方法(“tabWasSelected()”),并且仅在实现时调用它。换句话说,不是使用“instanceof”测试类标识,而是测试该类是否实现了指定的方法。这在objective-C中的委托方法中很常见:

if ([delegate respondsToSelector:@selector(tabWasSelected)]) // if implemented
       [delegate tabWasSelected]; // invoke it

答案 2 :(得分:0)

在这种情况下,我要做的是我会定义一个TabLifecycleActions这样的接口,它会有onTabSelected()onTabDeselected()等方法,然后实现“ null “超类中的这些版本。然后,我所要做的就是连接UI组件以在正确的时间调用正确的方法,并在那些需要某些特定功能的子类中覆盖方法的实现。