【问题标题】:Java Interface Inner ClassJava 接口内部类
【发布时间】:2014-01-16 15:21:30
【问题描述】:

我仍在用 java 编写战舰游戏。
我在模块化方面遇到了麻烦:我需要使用接口构建数据类(模型)。
我得到的想法是建立一个这样的类层次结构:

BattleGrid => 一些方法,Grid => int rows, int cols, Cell[][] grid => char content

这意味着:
1. public 类是 BattleGrid 类(它提供外部方法,如 initGrid()、placeShip() 等);
2. 然后里面还有另一个类,Grid,它包含材质网格和一些信息,如网格行和网格列;
3. 在每个 Cell 中,都有该单元格的内容。
(显然都带有 setter 和/或 getter)

问题是:当我通过 BattleGrid 接口编写此代码时,内部类会自动声明为 public static。

这种结构的正确方法是什么??

【问题讨论】:

  • 不确定拥有内部类的不可抗拒的冲动从何而来。无论如何,如果您提供一个代码示例来演示您的问题,那会更清楚。
  • 为什么你想要一个BattleGrid接口和一个类Grid?只是问问。
  • 不知道 :P 我认为这是将网格隐藏在外面的好方法!!!!

标签: java interface inner-classes


【解决方案1】:

这就是接口的工作方式。公共接口中的所有内容都是公共的。如果你有成员变量,它们会自动成为静态的。尝试改用抽象类或将成员变量移至实现类。

【讨论】:

  • 是的,我考虑过抽象类,但可能我会使用 Patricia Shanahan 的方法!!! :) 谢谢!!!
【解决方案2】:

你的问题很笼统,但我会尽力回答:最好让事情尽可能简单:

  • 使您的接口成为顶级类(即在它们自己的文件中)
  • 除非必要,否则不要使用内部类(我怀疑它们会为此)

【讨论】:

  • “除非必要,否则不要使用内部类(我怀疑他们会为此)”我会记住这一点:P 谢谢
【解决方案3】:

在设计你的界面时,专注于你想要的外部功能,完全忽略它是如何实现的。

例如,如果您需要 BattleGrid 以便能够在外部提供 Grid,则可以将它们声明为单独的接口,并将 Grid getGrid(); 作为 BattleGrid 中的方法。在编写BattleGrid 实现时,您可以选择通过将Grid 实现作为BattleGrid 中的内部类来实现它,但这与BattleGrid 接口无关。

如果您不需要BattleGrid 来在外部提供Grid,请不要在BattleGrid 界面中提及Grid

【讨论】:

  • 这看起来是个好主意!只是一个问题,你的意思是“如果您不需要 BattleGrid 来提供外部网格,请不要在 BattleGrid 界面中提及 Grid。”????这是否意味着我不会在接口中提及它,而只会在 BattleGrid 接口的实现中使用它?谢谢!
  • @luca89pe 是的。不属于外部类的外部行为的内部类不需要在其接口中提及。它就像一个私有字段。
  • 谢谢,我会写成 2 个独立的界面,因为我需要 Grid 才能将其绘制到 GUI 中!现在的问题是:在 Grid 中,我需要 int rows 和 cols,它们可以是静态的(但不是最终的,因为我必须在玩家选择难度时初始化它们),并且 Cell 矩阵必须是私有的!我显然不能在界面中这样做。我能怎么做?我要省略它们然后将它们实现到课堂上吗?谢谢!!!!!!! :)
猜你喜欢
  • 2011-08-01
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多