Проверка, является ли расширенный класс экземпляром интерфейса

1

Я пытаюсь проверить, является ли класс А, расширяющим класс B, экземпляром определенного интерфейса.

В основном здесь моя настройка:

public class House
{
    (variables)

    public House(variables) {...}
}

public class Kitchen extends House implements IFurniture
{
    (variables)

    public Kitchen(variables)
    {
        super(variables);
    }
}

public class Bathroom extends House implements IWalls

и так далее...

И у меня есть метод, когда я получаю литую, домашнюю версию кухни и ванной комнаты. Я в основном хочу это сделать:

public boolean hasFurniture(House house)
{
    if (house instanceof IFurniture){return true;}
}

Нужно ли использовать house.getClass(). GetInterfaces() и будет ли это работать, считая, что аргумент был отброшен?

Проблема в том, что я пишу мод для игры, и я не могу редактировать игровые классы. В этом случае можно редактировать только кухню, ванную комнату и hasFurniture.

Также игнорируйте имена классов, это просто имена примеров, чтобы вы не путали классы случайно.

  • 1
    Что не так с вашим методом hasFurniture ? Он должен работать.
  • 3
    Кстати, ваша иерархия классов не имеет особого смысла. Кухня - это не дом. Ванная комната - это не дом. Они не должны быть подклассами Хауса. Вероятно, они должны быть подклассами комнаты, а дом должен содержать коллекцию комнат.
Показать ещё 1 комментарий
Теги:
casting
interface

3 ответа

1

Позвольте работать с более понятной иерархией классов. Вы думаете о том, как вызвать экземпляр проблемы следующим образом:

public class Person{

    public void die(){
        System.out.println(this + " died");
    }

    public void pushOffCliff(){
        if(this instanceof Flyable)
            Flyable f = (Flyable)this;
            f.fly();
        else
            die();
    }
}

public interface Flyable{

    public void fly();
}

public class Superhero extends Person implements Flyable{

    public void fly(){
        System.out.println("Up, up, and away!");
    }
}

Когда имеет смысл использовать расширение класса и переопределяющую систему, как это делает Патрик в его ответе, как показано ниже. Люди (это действительно просто люди, а не супергерои) не летают. Когда они сбрасываются с обрыва, они должны умереть. Таким образом, класс человека не должен иметь дело с тем, "что, если я действительно не человек, я на самом деле..."; пусть подкласс справляется с этим.

public class Person{

    public void die(){
        System.out.println(this + " died");
    }

    public void pushOffCliff(){
        die();
    }
}

public interface Flyable{

    public void fly();
}

public class Superhero extends Person implements Flyable{

    public void fly(){
        System.out.println("Up, up, and away!");
    }

    @Override
    public void pushOffCliff(){
        fly();
    }
}
1

Вы тратите впустую преимущества полиморфизма. Вы не хотите использовать интерфейс с instanceof чтобы проверить, обладает ли объект свойством. implements и extends среднее значение IS-A, а не HAS-A. Вы явно хотите последнего. Сделайте это так:

public interface IFurniture {
    public boolean hasFurniture();
}


public class House implements IFurniture
{
    (variables)

    public House(variables) {...}

    @Override
    public boolean hasFurniture() {
        return false;
    }
}

public class Kitchen extends House
{
    (variables)

    public Kitchen(variables)
    {
        super(variables);
    }

    @Override
    public boolean hasFurniture() {
        return true;
    }
}

EDIT: Кроме того, Эран прав указывать, что эта иерархия не имеет большого смысла, в первую очередь, но это большая проблема.

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

Я просто решил это, благодаря Эрану.

Моя проблема заключалась в том, что я выбрал неправильный элемент. В этом случае я использовал ItemStack (Item с дополнительными данными) вместо Item. Добавив просто.getItem(), я надеюсь, что решил проблему.

Спасибо, что помогли, хорошо провели день!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню