标题翻译
Java: Calling a parent's method with child's member variable
问题
假设我有一个抽象的父类,其中有在一个方法中使用的成员变量。
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()
方法无法访问子类的成员变量。
是否有办法调用父类的方法,但让方法使用子类的成员变量?
英文翻译
Let's say I have an abstract parent class that has member variables which are used in a method.
public abstract class Person{
public String jobTitle;
public void printJob(){
System.out.println(jobTitle);
}
}
If I now have two child classes
public class Teacher extends Person{
public String jobTitle = "Teacher";
}
public class Janitor extends Person{
public String jobTitle = "Janitor";
}
and I want to avoid code cloning, i.e. implementing the same printJob()-method in both classes, I now have a problem, since the printJob()-method is unable to access member variables of the child classes.
Is there any way that i can call a parent classes' method but have the method use the child classes' member variables?
答案1
得分: 2
你可以像这样使用抽象方法:
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";
}
}
英文翻译
You can use abstract methods like this
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";
}
}
Updated after op's comment for code cloning...
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";
}
}
专注分享java语言的经验与见解,让所有开发者获益!
评论