Java, Class objects 有不同的方法吗?

Java, Class objects that have different methods to each other?

这似乎是一个奇怪的问题,但我正在尝试练习编写可重用代码,或者至少尝试练习以正确的方式思考它,如果您明白我的意思吗?我有一项作业涉及编写带有几个不同菜单的文本界面。因此,有两种方法:(1) 每个菜单的 class(草率)或(2)包含所有菜单信息的 class(不是草率的)。

既然我正在写这篇文章,感觉这可能是一种不好的做法,但是是否有可能 class 包含菜单的基本组件(标题、MenuOptions 列表等) ), 但这些方法可以在其他时间添加吗?

或者,如果这不是 possible/advisable,这通常是执行此类操作的首选方式,(a) 单独的 classes 用于单独的菜单,或 (b) 一个大的class 其中包含不同菜单的所有代码?

is it possible to have one class which contains the basic components of a menu(a title, a list of MenuOptions etc), but the methods can be added at another time?

从基本 "coding" 的角度来看,您可以创建一个 abstract class 并在其中声明您的核心组件(确保它们未在 private 范围内声明),然后编写一个第二个 class 到 extend 你的摘要 class,你在其中声明你的方法。除非您计划让多个 classes 扩展您的摘要 class,否则没有必要创建这种分离。

您没有提供足够的整体项目范围,所以我将保留对此的回答。

我想我理解你的意思,但我也认为当你说 but the methods can be added at another time? 你的意思是 方法所做的是在另一个时间添加的

菜单,在你的情况下,通常需要处理一些基本的东西,比如

  • 显示实际的菜单文本(我们称之为标题);
  • 显示工具提示;
  • 单击时执行某些操作。
  • Child 个子菜单项。

要实现此目的,您可以使用其中一种或混合使用两种方法:

  1. strategy 设计模式。
  2. 摘要classes.

策略设计模式允许您指定行为,然后将其传递给知道如何处理该行为的class。简而言之,您的行为可能是单击菜单项时发生的情况。所以基本上,您的菜单 class 将 不会 知道单击它时要做什么,但它 知道调用的对象是谁被委派。这种方法将允许您拥有一个 Menu class 和它可以访问的多个行为。

使用抽象 classes 类似于使用设计模式,但是,您最终会为每个想要的不同菜单创建一个新的具体 class。

因此,我认为最好的结果应该介于两者之间。

例如,您可以将 Menu parent class 创建为 abstract,并使用 TitleTooltip 等属性. 然后你可以添加一个名为 onActionPerformed 的方法,它接受一些 object 来处理当菜单项被点击时发生的事情。最后,您可以创建抽象方法,例如 onBeforeActionPerformedonAfterActionPerformed,这实际上是拦截器,允许您在事件处理之前和之后执行逻辑。

然后您可以使用 NonInterceptibleMenu 等扩展 Menu class 来处理不同的场景。

您可能会混淆 classes 与 class 的不同 实例 。例如,您可以有一个 class 用于菜单,但是 class 的两个不同对象,每个菜单一个,每个都有自己的一组数据来描述菜单项及其作用,因为每个几乎以相同的方式工作,但在不同的数据上。

或者,如果菜单行为不同但有一些共性,您可能需要为公共位定义一个 class,然后创建子classes,每个子classes,每个都有关于如何是什么让这种菜单与众不同。

您可以为 menu-item 和菜单本身(作为 menu-item 的 collection)设置通用的 class。这些 classes 不包含任何关于点击行为的逻辑,但它们只涵盖一般部分,如 UI、布局、标题占位符 - 一般配置。

你可以'methods added later'。这可以通过委托或 lambda 函数来实现。在Java中你可能在Swing中遇到过类似的配置,当你有按钮和点击侦听器(甚至菜单)时。你可以看看JMenuBar,JMenu,JMenuItem classes及其接口的用法你可能会感兴趣)。

您可能会遇到很多 'methods are added' 作为匿名 classes 的示例,这是在 lambda 函数到达 Java 8

之前