Как разделить переменную между классами без расширений

В игре, над которой я работаю, один класс рисует спрайт, а другой класс манипулирует координатами (например, если спрайт вот-вот исчезнет с экрана, остановите его на этом. Да, я это знаю это векторная графика). Во всяком случае, мне нужно, чтобы координаты были разделены между обоими классами. Я пытался сделать это с расширением класса, но это привело к переполнению стека, потому что суперкласс (класс, рисующий спрайт) должен создать экземпляр подкласса (класс, который будет манипулировать переменными).

// 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

Как бы я мог разделить координаты целочисленной переменной между двумя классами, не расширяя один класс.


person kullalok    schedule 01.07.2012    source источник
comment
Что не так с геттерами и сеттерами? Из вашего примера не совсем понятно, но вы почти наверняка слишком много думаете об этой проблеме - она ​​очень распространена. Не могли бы вы опубликовать более подробный пример?   -  person dimo414    schedule 02.07.2012
comment
Я не рассматривал геттеры и сеттеры. Я все еще старшеклассник. Что это?   -  person kullalok    schedule 02.07.2012
comment
Довольно простая идея: один объект (не класс, будьте осторожны, термин, который вы используете, важен) содержит координаты и имеет метод getCoordinates(), который можно вызвать и передать второму объекту.   -  person dimo414    schedule 02.07.2012


Ответы (2)


Вы узнали, что неправильное использование наследования не решит эту проблему. Вместо этого расширяйтесь через композицию: передайте ссылку на спрайт от одного объекта к другому и работайте со ссылкой.

Итак, дайте классу, который должен иметь доступ к спрайту, переменную Sprite, sprite, а затем передайте ссылку Sprite через метод установки, т.е.

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

или установите его через конструктор класса.

person Hovercraft Full Of Eels    schedule 01.07.2012

Это фундаментальный вопрос Контроллер представления модели. и я предполагаю, что вам не хватает части «Контроллер». Вам нужен центральный класс, работа которого заключается в управлении как игровой логикой (модель), так и логикой отображения (представление) и обменом данными между ними. Там много ресурсов, статья в Википедии, на которую я ссылался, является хорошим началом.

Судя по тому, как вы сформулировали свой вопрос, я подозреваю, что вы еще не очень хорошо разбираетесь в наследовании объектов - это нормально, это не совсем просто - но вы почти никогда не хотите расширять объект, чтобы обмениваться данными между двумя разными классами , что, похоже, вы пытаетесь сделать здесь.

Общее эмпирическое правило для «Должен ли я расширить этот объект?» представляет собой отношение Имеет-A и Является-A. По сути, если объект является другим объектом, один из них, вероятно, должен расширять другой. Если нет, то и не должны. Думайте, что Car Is-A Vehicle так Car extends Vehicle, но Car Has-A Sunroof так Sunroof не должно расширять Car. Опять же, читайте ссылку для получения дополнительной информации.

person dimo414    schedule 01.07.2012