2017-02-17 17 views
0

У меня есть несколько классов: book и video, оба из которых extend item:Переменная nonvisibility в классах, которые проходят другой

class item { 
    int item_num; 
    String title; 
} 
class video extends item { 
    double length; 
    char rating; 
} 
class book extends item { 
    String author; 
    int year; 
} 

У меня есть текстовый файл значения, которые должны быть вставлены в список item s. Текстовый файл выглядит следующим образом:

v 382 Armageddon 120 P 
v 281 Scream 138 R 
b 389 Othello Shakespeare 1603 
v 101 Cellular 110 P 
b 482 Hatchet Paulson 1987 

И как файл читается:

list<item> theList; 
item newItem; 
while(true) { 
    if(file.isEOF) { break; } 
    if(file.getChar == 'v') { 
     newItem = new video(); 
     /* the get___ methods below grab the next value 
     * in the file. Values tab delimited */ 
     newItem.item_num = file.getInt(); 
     newItem.title = file.getString(); 
     newItem.length = file.getDouble(); 
     newItem.rating = file.getChar(); 
    } else if (file.getChar == 'b') { 
     newItem = new book(); 
     newItem.item_num = file.getInt(); 
     newItem.title = file.getString(); 
     newItem.author = file.getString(); 
     newItem.year = file.getInt(); 
    } 
    theList.add(newItem); 
} 

Netbeans появляется сообщение об ошибке, что book и video переменные не в классе item.

Почему нет переменных для переменных в классах, которые расширяют элемент? Как получить доступ к этим переменным?

ответ

1

Родительский класс не знает, что такое его дочерние поля. Чтобы получить правильный доступ к этим полям, вместо создания экземпляра item, вы должны создать экземпляр video и book соответственно, а затем добавить каждый из них в список. Это также означает, что вы не можете использовать метод add в конце обоих операторов if, так как они должны быть добавлены внутри if s.

Поскольку это будет смешанная коллекция иерархии, вы можете написать List<? super item> theList = new ArrayList<>(); и добавить элементы таким образом.

+0

Обычный пример, с которым я столкнулся с полиморфизмом, - это класс «животных», который «собака», «кошка» и т. Д. Расширяются. Эти экземпляры 'dog' и' cat' как 'animal var = new dog()'. То, что я делаю, ничем не отличается, нет? – gator

+0

@gator: Вы пытаетесь получить доступ к свойствам дочернего объекта в своем родителе. Это похоже на попытку вызвать свойства 'String' на' Object'; просто потому, что 'video' ** - это **' item', это не означает, что 'item' ** is-a **' book'. – Makoto

2

Проблема newItem имеет тип item. В то время как book и video оба являются item, обратное неверно.

Если вы хотите, чтобы компилятор увидел переменные, объявленные в подклассах, вам необходимо отправить newItem в соответствующий подкласс перед доступом к их переменным. Это можно сделать каждый раз, когда вам нужно, но предпочтительно вам нужно сказать book b = new book() вместо item newItem = new book().

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

  • Нет связанных вопросов^_^