#java #instanceof
#java #instanceof
Вопрос:
Я ищу некоторую помощь по проблеме Java (1.8). У меня есть класс (я изложу его ниже), который имеет несколько методов с одинаковым именем, использующих разные типы параметров, но все они наследуют один и тот же интерфейс. Я хотел вызвать этот метод, используя переменную из интерфейса и java, чтобы использовать адаптированный метод, главным образом, чтобы избежать использования нескольких экземпляров … или шаблона посетителя, который, на мой взгляд, значительно улучшил бы сложность кода, чего я бы избегал.
Вот класс :
public class BoxAdapterToRenderer {
public static Node createRenderer(Fighter fighter){
Rectangle fighterRenderer = new Rectangle();
fighterRenderer.setHeight(50);
fighterRenderer.setWidth(50);
Image im = new Image(Constants.ruleReader.getFighterImageURL(fighter.getName()),false);
fighterRenderer.setFill(new ImagePattern(im));
return fighterRenderer;
}
public static Node createRenderer(Bomb bomb){
Rectangle bombRenderer = new Rectangle();
bombRenderer.setHeight(50);
bombRenderer.setWidth(50);
Image im = new Image(Constants.ruleReader.getBombImageURL(),false);
bombRenderer.setFill(new ImagePattern(im));
return bombRenderer;
}
public static Node createRenderer(Mine mine){
Rectangle mineRenderer = new Rectangle();
mineRenderer.setHeight(50);
mineRenderer.setWidth(50);
Image im = new Image(Constants.ruleReader.getMineImageURL(),false);
mineRenderer.setFill(new ImagePattern(im));
return mineRenderer;
}
public static Node createRenderer(StaminaPad staminaPad){
Rectangle staminaPadRenderer = new Rectangle();
staminaPadRenderer.setHeight(50);
staminaPadRenderer.setWidth(50);
Image im = new Image(Constants.ruleReader.getStaminaPadImageURL(),false);
staminaPadRenderer.setFill(new ImagePattern(im));
return staminaPadRenderer;
}
вот пример вызова :
Box box = board.getGrid()[i][j];
BoxAdapterToRenderer.createRenderer(box)
Итак, здесь мой интерфейс — Box, а мои разные наследуемые классы — Fighter, bomb, mine и т. Д…
здесь java не хочет компилироваться, потому что она не обнаруживает createRenderer с параметром типа Box
Также я хотел бы добавить, что Box и его различные наследники являются частью модели глобального шаблона MVC. метод createRenderer здесь вызывается в представлении, и модель вообще не должна учитываться представлением, обычно определение метода createRenderer в Box не является решением.
Комментарии:
1. Мне кажется, что интерфейс Box должен иметь метод createRenderer, а классы Mine, StaminaPad, Bomb, Fighter будут реализовывать их по-другому (вместо этого в классе BoxAdapterToRenderer).
2. Спасибо и извините, я обновил свой вопрос, я забыл упомянуть о MVC, ваше решение здесь не может работать.
3. Посмотрите на en.wikipedia.org/wiki/Multiple_dispatch . Вероятно, это невозможно в Java.
Ответ №1:
Я думаю, вы ищете что-то вроде этого:
interface Box
{
Node createRenderer();
}
class Fighter implements Box
{
@Override
public Node createRenderer() {
//TODO: implement this
return null;
}
}
class Bomb implements Box
{
//TODO: implement this
@Override
public Node createRenderer() {
return null;
}
}
class Mine implements Box
{
//TODO: implement this
@Override
public Node createRenderer() {
return null;
}
}
class StaminaPad implements Box
{
//TODO: implement this
@Override
public Node createRenderer() {
return null;
}
}
Пример вызова:
Box box = board.getGrid()[i][j];
box.createRenderer();
У вас есть окно интерфейса, которое описывает поведение, которое должны иметь все поля.
И тогда каждый класс, который реализует этот интерфейс, будет иметь свою собственную реализацию методов, которые вы определили. Предполагая, что board
содержит разные объекты, которые реализуют интерфейс Box, тогда вы можете вызвать метод .createRenderer() без необходимости проверять, какую конкретную реализацию имеют объекты.
Комментарии:
1. Спасибо и извините, я обновил свой вопрос, я забыл упомянуть о MVC, ваше решение здесь не может работать.