我将使用Java作为示例,但这个问题确实适用于所有OO语言:
假设我有几种不同的标签类型:例如研究,信息和帮助。根据需要,这些都放在JTabbedPane中。需要哪些标签会有所不同。当用户选择包含“研究”选项卡类型的选项卡时,需要运行setStandards()
。其他选项卡类型不需要这样做。这可以通过两种方式实现:
if (pane instanceof Research) {
(Research)pane.setStandards();
}
或在Info / Help类(或其父级)中实现空setStandards()
方法。
第一种方法很丑陋,但我的问题是,是否可以使用空方法在不透明的情况下在任何标签上调用setStandards()
,即使它什么都不做?这个占位符方法似乎有点傻。
答案 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组件以在正确的时间调用正确的方法,并在那些需要某些特定功能的子类中覆盖方法的实现。