2016-11-15 1 views
-1

내 프로그램의 하위 클래스에 setter 및 getter를 제공하는 배열을 가져 오는 데 문제가 있습니다. Java 수퍼 클래스, 서브 클래스 및 배열. 배열에 표시되지 않는 하위 클래스 메서드 상속

나는 메인 클래스 Person, 서브 클래스 SchoolEmployeeSchoolEmployee에서 필드를합니다 ( Person 클래스의 필드를 상속) 상속이 개 서브 클래스가 있습니다.

모든 것이 작동하는지 확인하기 위해 테스트 파일을 만들었지 만 Person 클래스의 메서드 만 제공 할 수있는 것으로 보입니다.

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...); 

내 문제 I가있다 : I는 I 각 클래스 이루어지는 생성자를 사용한 배열에 값을 넣어 진행이어서,

Person[] schoolemployees = new Person[4]; 

:

예를 들어, I는 배열을 만들어 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. 모든 PersonsetFirstName을해야한다면, 당신은 그것을 위해 사람에 추상 (또는 콘크리트) 메소드를 선언 할 수 있습니다.

  2. 주어진 배열 항목이 Teacher 일 것이라 확신하는 경우 Teacher t = (Teacher)schoolemployees[1];을 입력 할 수 있습니다. 그런 다음 t에서 교사 방법을 호출 할 수 있습니다. 그러나이 사람이 교사가 아님이 밝혀지면 예외가 생깁니다.

  3. 어쩌면 배열을 SchoolEmployee[] (대신 해당 클래스가 사용자의 메서드를 갖고있는 것으로 보입니다)로 설정하고 싶을 수도 있습니다.

+0

3 번 방법 만 작동하지 않으면 '사무실'이나 '교사'에 다른 방법이 없다면 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"); 
관련 문제