Указатели полиморфизма Java - PullRequest
0 голосов
/ 04 октября 2018

Я немного изучал Java и столкнулся с проблемой, которую не мог решить (я занимался исследованиями, но, поскольку это довольно специфический вопрос, ответа не было найдено):

I 'Я пытаюсь добавить переменные и методы, которые были бы унаследованы классами так же, как это делает интерфейс (есть класс, унаследованный от различных классов, у которых уже есть предок, то есть: Actor расширяет Character, а Weapon расширяет Item, мне нужны и Actor, иОружие, имеющее координаты XY, метод width / height и move ())

Сначала я подумал, что Интерфейсы - это решение, но поскольку они являются на 100% абстрактными, мне нужно будет каждый раз переопределять методы, что,мне, бьет цель наследования в этом случае.

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

Редактировать

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

1 Ответ

0 голосов
/ 04 октября 2018

Языковые конструкции, которые вы можете использовать: интерфейсы или абстрактные классы .

  • Интерфейсы: определяют общее поведение во всехнесвязанные объекты (например, объекты, которые можно сериализовать, объекты, которые можно сравнивать и т. д.).
  • Абстрактные классы: определяют общее поведение в иерархии объектов (например, оно будетимеет смысл определить метод getPrice в Item и наследовать его в Weapon).

В вашем примере такие методы getWidth(), getHeight(), getX() и getY() являются хорошими кандидатами на интерфейсы (поскольку они имеют некоторые общие черты между несвязанными объектами).

// Another way to share this state would be via a Point interface and 
// aggregating two point objects in your Item and Character classes
interface Coordinates {

    double getX1();

    double getY1();

    double getX2();

    double getY2();

}

interface Dimension {

    double getWidth();

    double getHeight();

}

Я не знаю всего вашего контекста, но вы уверены, что вам нужны координаты и размеры (думаю, вы могли бы определить ширину и высоту по X и Y)?

Эти интерфейсы должны быть реализованы вашими классами-предками (Character и Item) и наследоваться через иерархию. не добавьте общего предка между Character и Item, просто чтобы избежать двойного применения getX и getY.

Что касается метода move, я думаюэто еще одна ответственность, и вы должны определить это где-то еще.

// Not necessarily the right name
class MoveHelper {

    // You can pass either a Character or an Item here
    // since both implement Coordinates
    // Not necessarily the right signature
    void move (Coordinates object)

}

В зависимости от того, как вы решили создать свое решение, метод move может стать где-то static или объектом, который вы будете собирать в Character и Item и делегироватьэто для реализации move.

В качестве заключительного замечания учтите, что вы можете добиться повторного использования либо с помощью наследования (интерфейсы и абстрактные классы), либо композиции (чтовы бы это сделали, если бы вы агрегировали MoveHelper и делегировали ему для реализации move в Character и Item).

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...