在我正在进行的游戏中,一个类具有绘制精灵的工作,而另一个类具有操纵坐标的工作(即,如果精灵即将离开屏幕,则将其停在那里。是的,我知道这是矢量图形)。无论如何,我需要在两个类之间共享坐标。我尝试使用类扩展来做这个,但是这会产生堆栈溢出,因为超类(绘制sprite的类)必须创建子类的实例(将要操作变量的类)。
// 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
如何在不扩展一个类的情况下共享两个类之间的整数变量坐标。
答案 0 :(得分:4)
您已经了解滥用继承无法解决此问题。而是通过组合扩展:将对sprite的引用从一个对象传递给另一个对象并使用引用。
所以给需要访问sprite的类一个Sprite变量,sprite,然后通过setter方法传入Sprite引用,即
public void setSprite(Sprite sprite) {
this.sprite = sprite;
}
或通过类的构造函数设置它。
答案 1 :(得分:3)
这是一个基本的Model View Controller问题,我的猜测是你错过了“控制器”的一部分。你需要一个中心课,它的工作是管理游戏逻辑(模型)和显示逻辑(视图)并在它们之间共享数据。那里有很多资源,我链接的维基百科文章是一个好的开始。
从你提出问题的方式来看,我怀疑你对对象继承没有很强的把握 - 没关系,这并不完全简单 - 但是你几乎不想扩展对象以便在两个不同的类,这听起来就像你在这里尝试的那样。
“我应该扩展这个对象吗?”的一般经验法则。是Has-A vs. Is-A关系。基本上,如果一个对象是另一个对象,则可能应该扩展另一个对象。如果没有,他们不应该。请Car Is-A Vehicle
Car extends Vehicle
Car Has-A Sunroof
,但Sunroof
,Car
不应该{{1}}。{{1}}再次,阅读链接了解更多信息。