2013-04-17 2 views
5

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

Допустим, я строю армию с занятиями. В верхней части моей структуры Inheritance у меня есть реферат «Unit». Затем аннотация "Flying", "Основание" и "Здание" класс, который расширяет блок. Затем бетон «Вертолет» и «Jet» класс, который распространяется на Flying. Как и бетон «Soldier» и «Tank» класс, который расширяет землю. и, наконец, «HQ» и «Поставка», который расширяет здание.

Ниже приведен метод класса под «» Солдат:

public void attack(Unit enemy){ 
if(enemy.getSuperclass().equals(Flying)){ 
    System.out.print("Soldiers cant attack flying units"); 
} 
else{ 
    //Code to attack enemy here 
} 

Хочу противника, чтобы быть в любой форме блока. Это связано с тем, что солдат должен иметь возможность атаковать как здания, так и другие наземные подразделения. Однако я не хочу, чтобы солдаты могли атаковать летающие объекты.

Очевидная проблема в том, что, поскольку я объявил врага как Unit, он не знает, какой подкласс он принадлежит, и поэтому пытается найти суперкласс для блока, который не существует.

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

+2

Ничего себе, 5 эквивалентных ответов, опубликованных в том же 10-секундном разрезе! –

+2

Вы также можете использовать интерфейсы, поскольку наследование классов может ограничивать моделирование всех. Но сначала попытка наследования прекрасна. –

+1

* примерof * изумление! – NINCOMPOOP

ответ

11

Изменить

if(enemy.getSuperclass().equals(Flying)){ 

в

if(enemy instanceof Flying){ 

Это будет проверять, если enemy является экземпляром какого-либо из классов, которые вытекают из Flying, а не проверять специально для Flying класса (который мы знаем, что enemy не будет, так как Flying является абстрактным).

instanceof очень удобно, но всякий раз, когда я его использую (и иногда я делаю), я отступаю и смотрю на свою структуру в надежде, что я смогу найти способ рефакторирования, чтобы избежать этого (возможно, вещи, на которые можно нападать солдаты имеют общую характеристику и могут использовать абстрактный класс Unit   — GroundBased или что-то   —, которое вы могли бы использовать для аргумента вместо Unit). Возможно, вы не сможете в этом случае, но стоит дважды проверить.

+0

Переосмысление дизайна класса - хороший совет. Хорошим способом может быть также использование интерфейса и реализация общих частей в подразделе подкласса. С интерфейсом вам не нужно беспокоиться о том, что класс получен из конкретной реализации другого класса, но вы все равно можете убедиться, что bevhiour одинаковый. – Devolus

+0

Да, но интерфейс не позволит мне создавать методы резака cookie для применения к конкретным классам ниже. Мне нужно было бы повторно создать метод для каждой единицы. Если я не понимаю интерфейсы правильно. – KroniK907

1

ли вы попробовать:

if (enemy instanceof Flying) 
2

Попробуйте использовать instanceof оператора.

if(enemy instanceof Flying){ 
     System.out.print("Soldiers cant attack flying units"); 
    } 
    else{ 
     attack(enemy); 
    } 
1

Я думаю, что вы ищете instanceofoperator.

Оператор instanceof сравнивает объект с указанным типом. Вы можете использовать его для проверки, является ли объект экземпляром класса, экземпляром подкласса или экземпляром класса, который реализует определенный интерфейс.

Таким образом, вы можете обновить вы действуете, как следующее:

if(enemy instanceof Flying){ 
    System.out.print("Soldiers cant attack flying units"); 
} 
else{ 
    attack(enemy); 
} 
2

Вы можете использовать InstanceOf для этого. Это также работает, например, для интерфейсов.

Обратите также внимание на то, что переменная может не иметь значения null при использовании instanceof.

класс В Расширяет

public class test 
    { 
    public static void main(String[] args) 
    { 
     A a = new B(); 
     B b = new B(); 
     if(a instanceof A) 
      System.out.println("B derived from A"); 
     if(b instanceof A) 
      System.out.println("B derived from A"); 
    } 
    } 
0

Это дизайн запах. Основным требованием является работа для Visitor pattern, но вы также должны использовать полиморфизм лучше, чем это, прежде чем вы даже попадете к посетителю.

Смежные вопросы