允许两个类共享变量和方法

时间:2018-10-24 17:31:31

标签: java oop organization

所以我试图使我的程序更有条理。为此,我在文件中包含我的方法,另一个包含事件侦听器和变量。第二个文件需要使用第一个文件中的方法来更改变量等。第一个需要使用第二个中的变量才能正常运行。基本上:

public class Controls extends javax.swing.Jfarme{
   int turns = 0;
   int stuff = btnSet(jButton1);
}

public class GamePlay{
   public int btnSet(javax.swing.JButton btn){
   //do stuff using turn
   turn++;
   }
} 

这有意义吗?我怎么让这两个分享?
编辑:我想要两个类,以使其更好地组织。我制作了TicTacToe,然后是TicTacTwo,现在是TicTacCube。简直有点混乱(我现在有243个JButton可以跟踪)。我只是想将我的方法与正在执行的代码分开,以使其美观。

3 个答案:

答案 0 :(得分:1)

免责声明:当然,有很多方法可以设计应用程序的类体系结构,因此以下只是一种方法(但不是最差的一种)。

我的印象是您尚未采用面向对象设计和编程的概念。

如果您向其他人描述(游戏?)应用程序,那么您肯定会使用很多名词和动词。经验法则是使类别脱离名词,使方法脱离动词。我猜想“ Controls”(尤其是复数形式)和“ GamePlay”一词在您的描述中不会是最突出的,所以不要从这里开始。取而代之的是,我希望名词像“ Player”,“ Board”或“ Figure”,以及动词像“ move”,“ collect”,“ shoot”或您所玩的游戏。对于成为方法的动词,您必须确定它们属于哪一类,并且主要通过回答问题是谁或句子的主语来做到这一点,例如move()应该成为Figure的一种方法,因为它不是棋盘或玩家在移动,而是棋盘上的人物。

在进一步设计类时,应专注于实体的内部工作原理(“业务逻辑”),而不是用户界面-应将其保留在不同的类中。

因此,这样一个应用程序的体面设计可能带有一个GamePlay类和该应用程序的顶级工作流,但是GamePlay不应具有任何用户界面(javax.swing。* )中的元素。用户界面(也许类似于您的Controls类)应该仅通过调用其某些方法而不是通过读取字段来与GamePlay及其同伴进行通信。

P.S。关于StackOverflow上的问题:最好将实际代码的一部分复制到问题中,因此避免使用像Jfarme这样的错字而不是JFrame

答案 1 :(得分:0)

据我所知,实际上有两种方法可以做到:静态或使用对象(毕竟Java是一种面向对象的语言)

静态

静态方法有效地意味着所有变量和方法都属于 classes 本身。这将需要将关键字static放在Controls类中的所有变量和GamePlay类中的所有方法之前。然后ClassName.variableClassName.method(),例如Controls.turnsGamePlay.btnSet(btn)

使用对象

这种方法意味着将创建类的新 instances ,每个类都具有自己的实例变量和方法,可以使用instance_name.variableinstance_name.method()对其进行访问。这将涉及创建类的实例,例如Controls controls_instance = new Controls()GamePlay gameplay_instance = new GamePlay(),然后引用其属性,例如controls_instance.turnsgameplay_instance.setBtn(btn)

答案 2 :(得分:0)

要使其与您当前的设计配合使用:

  1. 要使用btnset()类中的Controls函数,请将GamePlay类导入Controls类,然后实例化GamePlay类对象访问其btnset()函数。 例如GamePlay gameplay = new GamePlay(); gameplay.btnset();

  2. 要在turns类中使用GamePlay变量,请将Controls类导入GamePlay类,然后实例化Controls类对象访问其turns变量。 例如 Controls controls = new Controls(); controls.turns++;

或者,您可以将方法或变量设置为静态,因此无需首先实例化对象。如果方法/变量是静态的,则可以调用GamePlay.btnset();Controls.turns++;