【问题标题】:How to share a variable between classes without extensions如何在没有扩展的类之间共享变量
【发布时间】:2012-07-01 22:56:22
【问题描述】:

在我正在开发的一款游戏中,一个类负责绘制精灵,而另一个类负责操作坐标(即,如果精灵即将离开屏幕,请将其停在那里。是的,我知道这是矢量图形)。无论如何,我需要在两个类之间共享坐标。我曾尝试使用类扩展来执行此操作,但这会产生堆栈溢出,因为超类(绘制精灵的类)必须创建子类(将要操作变量的类)的实例。

// In the superclass Render
public AnimateMC mc = new AnimateMC( 2 ); // AnimateMC is the subclass of the 
                                             superclass, Render
//later in the program
//code for drawing all of the shapes in the sprite
mc.gravitizeY(); // this is why I need to make an instance of AnimateMC

// In the subclass AnimateMC
// animates sprite by changing the coordinates

如何在不扩展一个类的情况下在两个类之间共享整数变量坐标。

【问题讨论】:

  • getter 和 setter 有什么问题?从您的示例中并不完全清楚,但是您几乎可以肯定地过度考虑了这个问题-这是一个非常常见的问题。你能发布一个更详细的例子吗?
  • 我没有介绍 getter 和 setter。我还是个高中生。那些是什么?
  • 很简单的想法,一个对象(不是类,小心,你使用的术语很重要)拥有坐标,并且有一个getCoordinates() 方法可以调用并传递给第二个对象。

标签: java inheritance subclass superclass


【解决方案1】:

您已经了解到滥用继承不会解决这个问题。而是通过组合扩展:将精灵的引用从一个对象传递给另一个对象并使用该引用。

所以给需要访问sprite的类一个Sprite变量,sprite,然后通过setter方法传入Sprite引用,即

public void setSprite(Sprite sprite) {
   this.sprite = sprite;
}

或者通过类的构造函数来设置。

【讨论】:

    【解决方案2】:

    这是一个基本的Model View Controller 问题,我猜你错过了它的“控制器”部分。您需要一个中心类,它的工作是管理游戏逻辑(模型)和显示逻辑(视图)并在它们之间共享数据。那里有很多资源,我链接到的维基百科文章是一个好的开始。

    从您提出问题的方式来看,我怀疑您还没有很好地掌握对象继承-没关系,这并不完全简单-但是您几乎从不想扩展对象以在两者之间共享数据两个不同的类,这听起来像是你在这里尝试做的。

    “我应该扩展这个对象吗?”的一般经验法则是Has-A vs. Is-A 关系。基本上,如果一个对象是另一个对象,那么一个对象可能应该扩展另一个对象。如果不是,他们不应该。想想Car Is-A Vehicle 所以Car extends Vehicle 但是Car Has-A Sunroof 所以Sunroof 不应该扩展Car。再次阅读链接了解更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2018-01-18
      • 2011-04-14
      • 2013-06-10
      • 1970-01-01
      • 2019-08-17
      相关资源
      最近更新 更多