【问题标题】:Casting a class to call a method in a subclass强制转换类以调用子类中的方法
【发布时间】:2016-01-06 10:38:35
【问题描述】:

我有几门课,包括我的超级课:

Person.java

public class Person {
    private Name personName;
    private Person spouse;
    Person(String fullName) {
        personName = new Name(fullName);
        System.out.println(personName.toString());
    }
    Person(Person copyPerson) {
        this.personName = copyPerson.personName;
    }

    public void setSpouse(Person spouse) {
        this.spouse = new Person(spouse);
    }

    public String toString() {
        if(spouse !=  null) {
            return ("Name is " + getPersonName().toString() + "Married to " + spouse.getPersonName().toString());
        }
        else {
            return ("Name is " + getPersonName().toString());

        }
    }
    public float getFamilyIncome() {
        return ((NewWorker)personName).salary;
    }

    public Name getPersonName() {
        return personName;
    }

    public void setPersonName(Name personName) {
        this.personName = personName;
    }
}

我这个类的子类 NewWorker.java

public class NewWorker extends Person {
    private static int howManyWorkers = 0;
    private int workerNumber;
    private MyDate dateJoiningCompany;
    private float Salary = 0.0f;
    private NewWorker Supervisor;

    public NewWorker(String name, String date, double salary) {
        super(name);
        ++howManyWorkers; //Add one to total workers
        dateJoiningCompany = new MyDate(date);
        Salary = (float)salary;
        workerNumber = howManyWorkers;
    }
    public NewWorker(String name, String date) {
        super(name);
        ++howManyWorkers;
        dateJoiningCompany = new MyDate(date);
        workerNumber = howManyWorkers;
    }
    public void setSalary(double salary) {
        Salary = (float)salary;
    }
    public void setSupervisor(NewWorker supervisor) {
        if(supervisor != null) {
            Supervisor.setPersonName(new Name(supervisor.getSupervisorName()));
        }
        else {
            System.out.println("The person you are trying to assign a Supervisor to has no supervisor");
        }
    }
    public static int getHowManyWorkers() {
        return howManyWorkers;
    }
    public Name getSupervisorName() {
        return Supervisor.getPersonName();
    }
    public float getSalary(NewWorker person) {
        return person.Salary;
    }
    public String toString() {
            return ("Worker Number = " + workerNumber + " " + "Worker Name = " + super.toString() + " " + "Date Joined Company = " + dateJoiningCompany.toString() 
                    + " " + "Salary = " + Salary);
    }
}

还有我的名字类:

import java.util.StringTokenizer;

public class Name {
    private String firstName;
    private String middleName;
    private String lastName;
    public Name(String name) {
        StringTokenizer tokens;
        tokens = new StringTokenizer(name," ");
        int numTokens = tokens.countTokens();
        if(numTokens == 2) {
            firstName = tokens.nextToken();
            middleName = null;
            lastName = tokens.nextToken();
        }
        else if(numTokens == 3) {
            firstName = tokens.nextToken();
            middleName = tokens.nextToken();
            lastName = tokens.nextToken();
        }
        else {
            System.out.println("That was not a valid input");
            while(tokens.hasMoreElements()) {
                System.out.println(tokens.nextToken());
            }
            return;
        }
    }
    public Name(Name name) {
        if(name != null) {
            firstName = name.firstName;
            middleName = name.middleName;
            lastName = name.lastName;   
        }
    }
    public void setName(String first, String middle, String last) {
        firstName = first;
        middleName = middle;
        lastName = last;
    }
    public String toString() {
        if(middleName != null) {
            return (lastName + ", " + firstName + " " + middleName.charAt(0) + ".");
        }
        else {
            return (lastName + ", " + firstName);
        }
    }
}

现在我当前的问题出现在超类 Person.java 的行中:

public float getFamilyIncome() {
    return ((NewWorker)personName).salary;
}

现在我想做的是获得一个家庭的薪水(被称为人的薪水+配偶的薪水)目前我忽略了配偶部分并试图获得被调用的人的薪水。我通过以下方式测试我的程序:

public class Lab4Tester {
    public static void main(String[] args){
        NewWorker w1, w2, w3, w4, w5;
        Person p1, p2;
        MyDate d1, d2, d3, d4;

        p1 = new Person("Edward Teller");
        p2 = new Person("Liz Powell");

        w1 = new NewWorker ("Robert William Hunter", "23/10/2005", 35000.00);
        w2 = new NewWorker ("John Smith", "15/11/2005", 25000.00);
        w3 = new NewWorker ("Mary Jane Hull", "06/09/2007");
        w4 = new NewWorker ("Richard Mark Harry", "01/08/2004");
        w5 = new NewWorker ("Jessica Chowhan", "21/01/2006", 30000.00);

        w3.setSalary(40000.00);
        w4.setSalary(53000.00);
        w4.setSalary(55000.00);
        w4.setSalary(58000.00);

        w2.setSupervisor(w3);
        w3.setSupervisor(w4);
        w1.setSupervisor(w3);
        w5.setSupervisor(w4);

        w3.setSpouse(p1);
        p1.setSpouse(w3);

        w2.setSpouse(p2);
        p2.setSpouse(w2);

        w1.setSpouse(w5);
        w5.setSpouse(w1);


        System.out.println("Supervisor of w1 is " + w1.getSupervisorName());
        System.out.println("w2 is " + w2);
        System.out.println("w3 is " + w3);
        System.out.println("w4 is " + w4);
        System.out.println("w5 is " + w5);
        System.out.println("Total family income of Robert "
                            + w1.getFamilyIncome());
        System.out.println("Total family income of Edward "
                            + p1.getFamilyIncome());
    }

}

所以我只需要弄清楚如果对象属于NewWorker 类,我该如何设置薪水。我怎样才能做到这一点?我知道我需要以某种方式投射它,但我不确定如何。

感谢您的帮助

【问题讨论】:

  • 不清楚你在问什么。 “如果对象属于 NewWorker 类,我如何设置薪水”可能是错字吗?如果对象属于 NewWorker 类,您可以简单地调用方法 setSalary,就像您在示例中所做的 4 次一样。
  • 我假设你在温莎大学的 Java 编程课上。 Take a look at my post from a few days ago,我能够解决您的确切问题。
  • @ishyfishy 是的,谢谢

标签: java inheritance subclass


【解决方案1】:

为什么'getFamilyIncome' 是'Person' 中的一个方法,如果它只对'NewWorker's 有效?您应该将此方法移到您的“NewWorker”类中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 2018-10-15
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多