Я пытаюсь проверить, является ли класс А, расширяющим класс 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.
Также игнорируйте имена классов, это просто имена примеров, чтобы вы не путали классы случайно.
Позвольте работать с более понятной иерархией классов. Вы думаете о том, как вызвать экземпляр проблемы следующим образом:
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();
}
}
Вы тратите впустую преимущества полиморфизма. Вы не хотите использовать интерфейс с 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: Кроме того, Эран прав указывать, что эта иерархия не имеет большого смысла, в первую очередь, но это большая проблема.
Я просто решил это, благодаря Эрану.
Моя проблема заключалась в том, что я выбрал неправильный элемент. В этом случае я использовал ItemStack (Item с дополнительными данными) вместо Item. Добавив просто.getItem(), я надеюсь, что решил проблему.
Спасибо, что помогли, хорошо провели день!
hasFurniture
? Он должен работать.