Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用单一方法的面向对象解决方案_Java_Oop - Fatal编程技术网

Java 使用单一方法的面向对象解决方案

Java 使用单一方法的面向对象解决方案,java,oop,Java,Oop,我将以Java为例,但这个问题确实适用于所有OO语言: 假设我有几种不同的选项卡类型:例如,研究、信息和帮助。根据需要,这些都放在JTabbedPane中。需要哪些选项卡各不相同。当用户选择包含研究选项卡类型的选项卡时,需要运行setStandards()。其他选项卡类型不需要这样做。这可以通过两种方式实现: if (pane instanceof Research) { (Research)pane.setStandards(); } 或者在Info/Help类(或其父类)中实现空的s

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

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

if (pane instanceof Research) {
   (Research)pane.setStandards();
}
或者在Info/Help类(或其父类)中实现空的
setStandards()
方法


第一个方法很难看,但我的问题是,使用空方法允许在任何选项卡上不透明地调用
setStandards()
,即使它什么都不做,也可以吗?使用这种占位符方法似乎有点愚蠢。

您的第二种方法是这两种方法中最好的一种,但最好使用一种名为
tabSelected
或类似方法的方法。研究选项卡的
tabSelected
方法将调用
setStandards
。其他选项卡在此方法中不起任何作用。这样,它是一个有意义的方法,即使它在某些类中不起任何作用。

您的第二种方法是这两种方法中最好的一种,但最好是有一个名为
tabSelected
或类似的方法。研究选项卡的
tabSelected
方法将调用
setStandards
。其他选项卡在此方法中不起任何作用。通过这种方式,它是一种有意义的方法,尽管它在某些类中不起任何作用。

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

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

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

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

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

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

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

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

在这种情况下,我要做的是定义一个接口,如
TabLifecycleActions
,该接口将包含
ontAbsSelected()
ontAbdSelected()
等方法,然后在超类中实现这些方法的“null”版本。然后,我所要做的就是连接UI组件,以便在正确的时间调用正确的方法,并覆盖那些此时需要某些特定功能的子类中的方法实现。

在这种情况下,我要做的是定义一个接口,例如方法,如
onTabDeselected()
onTabDeselected()
等,然后在超类中实现这些方法的“null”版本。然后,我所要做的就是将UI组件连接起来,以便在正确的时间调用正确的方法,并在需要特定功能的子类中重写该方法的实现。

听起来不错。这在概念上是一样的,只是在命名约定方面更清晰了一点。我只是想知道是否有一种完全绕过这个概念的方法。在低层次上,它们是相同的,但代码不仅仅是用于与计算机通信,它还用于与该代码的未来维护者(包括6个月后的您)交谈。为“事件”(如“tabSelected”)提供高级方法是一件非常常见的事情,这样的方法在基类中可能不会显得不合适,而“setStandards”可能会。如果以后您决定帮助窗格需要加载帮助索引,您不想将“loadHelpIndex”添加到基类中,但将其添加到帮助中,然后从帮助的tabSelected方法调用它将是很自然的。至于是否有一种方法可以完全绕过它:某个地方需要做出决定。在OOP中,通常使用多态方法比instanceof(或等效方法)更好地在不同的行为之间进行选择。听起来不错。这在概念上是一样的,只是在命名约定方面更清晰了一点。我只是想知道是否有一种完全绕过这个概念的方法。在低层次上,它们是相同的,但代码不仅仅是用于与计算机通信,它还用于与该代码的未来维护者(包括6个月后的您)交谈。为“事件”(如“tabSelected”)提供高级方法是一件非常常见的事情,这样的方法在基类中可能不会显得不合适,而“setStandards”可能会。如果以后决定帮助窗格需要加载帮助索引,则不希望添加“loadHel”