2014-12-20 5 views
0

Пусть у меня есть имя класса СотрудникаКак получить доступ к частному полю в наследстве

class Employee 
{ 
    int empID; 
    String name; 
    public Employee(int empID,String name) 
    { 
    this.empID = empID; 
    this.name = name; 
    } 
    // getters and setters 
} 

Теперь я создаю подкласс на основе их положения

class Manager extends Employee 
{ 
    private String salary; 
    private int deptID; 
    public Manager(String salary, int deptID,int id, String name) 
    { 
    super(id,name); 
    this.salary = salary; 
    this.deptID = deptID; 
    } 
    // getters and setters 
} 

Если я хочу, чтобы получить доступ к EmpId и имя менеджера из класса Manager, как я могу это сделать, поскольку эти поля являются частными? Я думал о функции getter в классе Manager, я бы сделал super.getName() и super.getID()?

Если что-то не так в шаблоне дизайна класса, пожалуйста, дайте мне знать. Я хочу сделать его настолько совершенным, насколько это возможно. Спасибо за помощь.

+2

Поля не являются частными! –

+1

'empID' и' name' не * private *, но * package-private *. И что конкретно представляет собой ваш вопрос? Вы пытались использовать 'super.getName()' и 'super.getID()' и не удалось? Если да, то было сообщение об ошибке? – Pshemo

ответ

1

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

class Employee 
{ 
    protected int empID; 
    protected String name; 
    public Employee(int empID,String name) 
    { 
    this.empID = empID; 
    this.name = name; 
    } 
} 

class Manager extends Employee 
{ 
    private String salary; 
    private int deptID; 
    public Manager(String salary, int deptID,int id, String name) 
    { 
    super(id,name); 
    this.salary = salary; 
    this.deptID = deptID; 

    // Can access protected variables 
    empID = 0; 
    } 
} 

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

В настоящее время ваш переменные отмечены по умолчанию (без указания сбруи), вы можете увидеть, что различные аксессоры позволяют сделать здесь: http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

1

У вас есть 2 варианта

Изменить private в protected для того, чтобы разрешить подчиненным классам иметь прямой доступ к родительским полям, но не позволяя другим классам иметь прямой доступ.

private String salary; 
    private int deptID; 

в

protected String salary; 
    protected int deptID; 

Или Вы можете создать геттер/сеттер (с надлежащим модификатором доступа) в родительском классе и вызывать их из класса ребенка Э.Г. super.getFoo()

1

Как у вас есть, переменные базового класса по умолчанию пакет private, имеющий частный доступ в производном классе. В этом смысле методы геттера могут использоваться по этой причине и доступны на производных классах. Пожалуйста, помните, что геттеры являются обычными методами и выполняют позднюю привязку, поэтому будьте осторожны, чтобы не применять одни и те же методы getter на производных классах, которые делают что-то еще, иначе вы потеряете доступ к базовым переменным в некотором смысле.

+0

Неквалифицированные поля: * закрытый пакет *, не защищенный. –

+0

Верно, мое плохое. Обновлен ответ. Это нормально? –