Java: вызов метода родителя с дочерней переменной-членом - PullRequest
0 голосов
/ 16 марта 2020

Допустим, у меня есть абстрактный родительский класс, в котором есть переменные-члены, которые используются в методе.

public abstract class Person{
    public String jobTitle;
    public void printJob(){
        System.out.println(jobTitle);
    }
}

Если у меня теперь есть два дочерних класса

public class Teacher extends Person{
    public String jobTitle = "Teacher";
}
public class Janitor extends Person{
    public String jobTitle = "Janitor";
}

, и я хочу избежать клонирования кода, т.е. реализовать один и тот же метод printJob () в обоих классах, у меня теперь есть проблема, так как метод printJob () не может получить доступ к переменным-членам дочерних классов.

Есть ли способ, которым я могу вызвать метод родительских классов, но пусть метод использует переменные-члены дочерних классов?

Ответы [ 2 ]

2 голосов
/ 16 марта 2020

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

public abstract class Person {
   public void printJob() {
      System.out.println(getJobTitle());
   }

   protected abstract String getJobTitle();

   public static void main(String[] args) {
      Person teacher = new Teacher();
      Person janitor = new Janitor();

      System.out.println(teacher.getJobTitle());
      System.out.println(janitor.getJobTitle());
   }
}

class Teacher extends Person {
   @Override
   protected String getJobTitle() {
      return "Teacher";
   }
}

class Janitor extends Person {
   @Override
   protected String getJobTitle() {
      return "Janitor";
   }
}

Обновлено после комментария op для клонирования кода ...

public class Person {
   public static void main(String[] args) {
      System.out.println(new Teacher().job);
      System.out.println(new Janitor().job);
   }

   private static class Teacher extends Person {
      private String job = "Teacher";
   }

   private static class Janitor extends Person {
      private String job = "Janitor";
   }
}
0 голосов
/ 16 марта 2020

Ниже приведены два подхода:

abstract class Person {
    private String jobTitle;

    Person() {

    }

    Person(String jobTitle) {
        this.jobTitle = jobTitle;
    }

    public String getJobTitle() {
        return jobTitle;
    }

    public void setJobTitle(String jobTitle) {
        this.jobTitle = jobTitle;
    }

    protected abstract double getSalary();

    protected abstract void setSalary(double salary);
}

class Teacher extends Person {
    private double salary;

    Teacher() {

    }

    Teacher(String jobTitle) {
        super(jobTitle);
    }

    @Override
    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    protected double getSalary() {
        return salary;
    }
}

class Janitor extends Person {
    private double salary;

    Janitor() {

    }

    Janitor(String jobTitle) {
        super(jobTitle);
    }

    @Override
    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    protected double getSalary() {
        return salary;
    }
}

public class Main {
    public static void main(String[] argv) {
        Person teacher = new Teacher("Teacher");
        teacher.setSalary(3000);

        Person janitor = new Janitor("Janitor");
        janitor.setSalary(3500);

        Person headTeacher = new Teacher();
        headTeacher.setJobTitle("Head Teacher");
        headTeacher.setSalary(5550);

        System.out.println("Title: " + teacher.getJobTitle() + ", Salary: " + teacher.getSalary());
        System.out.println("Title: " + janitor.getJobTitle() + ", Salary: " + janitor.getSalary());
        System.out.println("Title: " + headTeacher.getJobTitle() + ", Salary: " + headTeacher.getSalary());
    }
}

Вывод:

Title: Teacher, Salary: 3000.0
Title: Janitor, Salary: 3500.0
Title: Head Teacher, Salary: 5550.0

Примечание: В вашем коде вы создали jobTitle в качестве участника c, который не имеет смысла для ваших требований, так как в любом случае будет доступен любому классу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...