2016-11-15 1 views
-1

У меня возникли проблемы с получением массива, который даст мне сеттеры и получатели для подклассов в моей программе.Суперклассы Java, подклассы и массивы. Наследовать методы подкласса, не отображаемые в массиве

У меня есть основной класс Person, подкласс SchoolEmployee и два подкласса, которые наследуют поля из SchoolEmployee (который наследует поля из Person класса).

Я создал тестовый файл, чтобы проверить, все ли работает, но он только может дать мне методы для класса Person.

Например, я создал массив:

Person[] schoolemployees = new Person[4]; 

Затем я продолжил ставить значения в массиве с помощью конструкторов, которые я сделал для каждого класса:

schoolemployees[0] = new Teacher(FirstNameHere, SecondName, etc...); 
schoolemployees[1] = new Teacher(FirstNameHere, SecondName, etc...); 
schoolemployees[2] = new Office(FirstNameHere, SecondName, etc...); 
schoolemployees[2] = new Office(FirstNameHere, SecondName, etc...); 

Моя проблема, я am только могу установить/получить поля и методы вызова из класса Person.

Например:

input = JOptionPane.showInputDialog(null, "Enter name for first name"); 
schoolemployees[1].setFirstName(input); 

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

Может кто-нибудь объяснить, почему я не могу увидеть унаследованные поля в массиве? Спасибо.

+3

Наследование означает, что 'SchoolEmployee' будут иметь все члены на' Person', не наоборот. – shmosel

ответ

2

Ваш массив напечатан как Person[]. Это означает, что компилятор знает, что каждый элемент является Person (или null). Он не знает, что schoolemployees[1] - это Teacher, поэтому он не позволит вам получать доступ к полям или методам, отличным от обычных для всех Person.

  1. Если все Person должны иметь setFirstName, то вы можете объявить метод абстрактного (или даже бетон) на Person для него.

  2. Если вы уверены, что данная запись массива - Teacher, вы можете выбрать тип: Teacher t = (Teacher)schoolemployees[1];. Затем вы можете вызвать методы учителя на t. Но вы получите исключение, когда этот человек окажется не учителем.

  3. Возможно, вы хотите, чтобы ваш массив был SchoolEmployee[] (у этого класса есть свои методы).

+0

Только путь №3 не будет работать, если у 'Office' или' Teacher' есть метод, другой нет, тогда OP нужно будет соответствующим образом выполнить, как в # 2. Отличный ответ. –

+0

WOW большое спасибо! Мне удалось вызвать другие методы из подклассов, используя литье типов! – Maximilious

0

Я думаю об этой проблеме, есть один способ. вы можете сделать абстрактный класс человека. и наследует SchoolEmployee. вы определяете тот же метод, который распространяет ваше мнение, например, setName (String str), потому что весь объект получает имя. и вы расширяете свою функцию.

0

Это происходит потому, что вы используете ссылку класса Person. Поэтому во время вызова метода компиляции вызов будет разрешен из класса Person. например

class Person { 
    private String firstName; 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
} 

class Student extends Person { 
    private String ClassName; 

    public String getClassName() { 
     return ClassName; 
    } 

    public void setClassName(String className) { 
     ClassName = className; 
    } 
} 

И вы обращаетесь к его ниже пути

Student student = new Student(); 
student.setFirstName("Naresh"); 
student.setClassName("Highschool"); 


// For compiler person is Person (at runtime it will be resolved to object of Student class), and person class doesn't have setClassName() defined in it compiler will give an error while accessing it 
Person person = new Student(); 
person.setFirstName("Naresh"); 

// Compilation error here because setClassName() is not accessible from Person 
person.setClassName("Highschool"); 
Смежные вопросы