2015-01-21 3 views
0

У меня есть суперкласса Dinosaur только с одним подклассом Tyranoс использованием полиморфных массивов в Java

я есть Dinosaur с этими атрибутами:

public Dinosaur(String name, String size, String movement, String diet, String terainType){ 
    ... 
    //i've already made the setters and getters along with some helper functions 
    } 

и у меня Tyrano с 2 дополнительные атрибуты, которые являются teeth и hobby

public Tyrano(String name, String size, String movement, String diet, String terainType, int teeth, String hobby){ 
    ... 
    //made setters and getters with some helper functions 
    } 

сейчас в моей программе драйверов i want чтобы сделать тип массива Dinosaur, который будет принимать несколько подклассов Dinosaur одного из них, который является подклассом Tyrano я делать, если его можно не знать, но мой инструктор сказал, что это так вот, что я сделал, это на главном:

Dinosaur[] dinoList = new Dinosaur[9]; 
dinoList[0] = new Tyrano("Gary", "Large", "other dino Meat", "Land", 30, "singing"); 
int teeth = dinoList[0].getTeeth(); 
String hobby = dinoList[0].getHobby(); 
...//i also called the helper functions that were in Tyrano 

он получает сообщение об ошибке:

error: cannot find symbol 
     dinoList[0].getTeeth(); 
       ^
error: cannot find symbol 
     dinoList[0].getHobby(); 
       ^
...//along with same errors with the helper functions that were in Tyrano 
...//it also happens when i call setters that were unique for the subclass Tyrano 

и я не знаю, почему именно это делать, я уже проверил и у меня нет синтаксических ошибок и я уже определил вспомогательные функции, а также тех, геттеры и сеттеры, но нет проблем для обычных, которые находятся в суперклассе Dinosaur

ответ

2

Если getTeeth() и getHobby() не существует для Dinosaur класса, вы не можете вызывать их из ссылки на Dinosaur. Даже если фактический экземпляр, хранящийся в dinoList[0], является Tyrano, вы не можете получить доступ к его уникальным методам без ссылки на Tyrano.

Это будет работать:

if (dinoList[0] instanceof Tyrano) { 
    Tyrano t = (Tyrano) dinoList[0]; 
    int teeth = t.getTeeth(); 
    String hobby = t.getHobby(); 
} 
0

Это типичная ошибка. Дело в том, что у вас есть массив динозавров, у которых нет зубов или хобби, это похоже на то, что у вас есть массив Личности, и один из этих «человек» является Учителем ... не все Личность - Учитель, как не все у динозавра есть зубы.

Итак, вам нужно спросить своего динозавра «Ты, Тирано»? и если ответ «да», тогда ... спросите его «тогда, как Тирано, что твой хобби?».

Позвольте мне, что в коде:

//are you a Tyrano? 
if(Tyrano.class.isAssignableFrom(dinoList[0].getClass())){ 
     // so, I treat you like a Tyrano 
     Tyrano tyranoDyno= (Tyrano) dinoList[0]; 
     //tell me... teeth and hobbies please? 
     int teeth = tyranoDyno.getTeeth(); 
     String hobby = tyranoDyno.getHobby(); 
} 
+0

Почему предпочтение для 'Tyrano.class.isAssignableFrom (dinoList [0] .getClass())' вместо 'dinoList [ 0] экземпляр Тирано? – Holloway

+0

В этом примере одно и то же, только личное предпочтение. Основное отличие заключается в том, что isAssignableFrom может выбрать класс во время выполнения. –

1

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

public class Dinosaur 
{ 
    private String hobby; 

    public String getHobby() { 
     return hobby; 
    } 
    ... 
} 

public class Tyrano extends Dinosaur 
{ 
    private String teeth; 

    public String getTeeth() { 
     return teeth; 
    } 
    ... 
} 

Тогда у вас есть следующие

Dinosaur dinosaur = new Tyrano(); 
String hobby = dinosaur.getHobby(); //this works 
String teeth = dinosaur.getTeeth(); //this is compile error! 
if(dinosaur instanceof Tyrano) { 
    Tyrano tyrano = (Tyrano) dinosaur; //casting 
    teeth = tyrano.getTeeth(); //this works 
} 
0

При создании подкласса, подкласс наследует поля и методы из суперкласса. Итак, Tyrano имеет все, что Dinosaur имеет, и немного больше (teeth и hobby).

Вы можете сделать другой класс, скажем Stego, который также расширяет Dinosaur и добавляет поле для armour.

Теперь ваш массив динозавров может содержать как Tyrano, так и Stego типов (они оба динозавры, так что это прекрасно). Но ваша программа не может предсказать, какой тип они будут. Поскольку Stego не имеет teeth или hobby, а Tyrano не имеет armour, вы не можете использовать эти поля напрямую (вместо этого, как предложил Эран). Вы, однако, можете использовать все поля от Dinosaur, так как все динозавры, как гарантируют, унаследовали эти

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