Использование наследования для изменения интерфейса суперкласса - PullRequest
0 голосов
/ 24 апреля 2011

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

Я использую существующий физический движок ( Phys2D ) для разработки своего рода игры. Этот физический движок имеет Body объектов, управляемых World, и к ним применяются различные силы, когда мир наступает. Для ИИ в игре важно, чтобы тела имели цвета (чтобы их можно было воспринимать), но это не поддерживается физическим движком, поэтому я создал подкласс и расширил класс Body, добавив в него класс это - http://pastebin.com/1nLYWg3w. Теперь, когда я создаю эти Body экземпляры, я могу вернуть их из World и получить их цвета.

Однако Netbeans говорит, что это

cannot find symbol
    symbol:   method getColour()
    location: class net.phys2d.raw.Body

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

Как я могу прикрепить цвета к Body объектам и не создавать страшных подчеркиваний и предупреждений? Я понимаю, что могу изменить сам Phys2D, но, за исключением потенциальных лицензионных ограничений (лицензия говорит, что вы можете сделать это с Phys2D), мне говорят, что это плохая практика.

Ответы [ 3 ]

2 голосов
/ 24 апреля 2011

Если вы знаете во время выполнения, что все ваши Body объекты на самом деле ColouredBody, тогда вы можете привести эти объекты к ColouredBody и вызвать getColour:

Body body = ...;
ColouredBody colouredBody = (ColouredBody) body;
colouredBody.getColour();
1 голос
/ 24 апреля 2011

На самом деле, я бы сказал, что было бы неплохо добавить свойство color к классу Body самого движка.

Если вы не можете этого делать или не хотите, всевам нужно привести Body экземпляры к ColouredBody перед их использованием:

((ColouredBody)body).getColour();

Это говорит компилятору: «Я знаю, что body действительно является экземпляром ColouredBody, поэтому давайтеЯ использую это как один "- но если это окажется не в любое время, вы получите ClassCastException.

1 голос
/ 24 апреля 2011

Можно бетонировать по типу:

ColouredBody cbody = (ColouredBody) body;

желательно, просто чтобы избежать проблем, вы можете проверить, действительно ли это правда:

if (body instanceof ColouredBody) {..}

Обратите внимание, что снижение рейтинга (от более общего к более конкретному классу) обычно считается плохой практикой.

Если это возможно, вы можете попытаться расширить World с помощью ColouredWorld и переопределить методы, которые возвращают Body, чтобы вернуть ColouredBody (а также удерживать тела в соответствующей коллекции), но это может перебор в зависимости от сложности.

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