[英]Abstract class getters and setters in java
所以,解释一下我的代码->
我有一个Employee类型的抽象类,它有自己的字段,例如名称。
然后,我有了从Employee扩展的Admin,Sales和Manager类。 这些都有各自的字段,例如admin的fixedBonus,Sales的percentBonus和经理的雇员数组列表。
然后,我有一个驱动程序类,其中包含一个EmployeeArray,因此它包含Admins,Sales和Managers。
我的问题出现在Arraylist元素上。 假设我从ArrayList中获得了Admin类的雇员,并尝试使用getter getFixedBonus()到达其fixedBonus字段,我简直不能。 如何做到这一点,这样我就可以使用类特定的getter和setter,而不仅仅是继承的? 这是我的代码的副本,出现问题的地方。 具体来说,问题在于switch语句的情况5和情况6。
private Employee editAnEmployee(Employee emp) {
boolean exit = false;
boolean validChoice = false;
int choice = 0;
Boolean sure = false; // used in the switch statement
String newName;
double newValue;
Employee admin = new AdminWorker("0", "0", 0, 0, 0); // these are used
Employee sales = new SalesWorker("0", "0", 0, 0, 0, 0); // to check the
Employee manager = new Manager("0", "0", 0, 0); // class of the
// employee
// being sent
// in, to edit
// the fields
// the employee
// may hold
do {
do {
validChoice = true;
emp.toString();
StdOut.println("Which field would you like to edit?");
StdOut.println("1) First Name.");
StdOut.println("2) last Name.");
StdOut.println("3) Hourly rate.");
StdOut.println("4) Hours worked in the last week.");
if (emp.getClass().equals(admin)) {
StdOut.println("5) Fixed Bonus.");
} else if (emp.getClass().equals(sales)) {
StdOut.println("5) Percentage bonus on sales.");
StdOut.println("6) Value of sales made in the last week.");
} else if (emp.getClass().equals(manager)) {
StdOut.println("5) Department.");
}
StdOut.println("0) Exit.");
choice = StdIn.readInt();
if (choice < 0 || choice > 4) {
if (emp.getClass().equals(admin) && choice <= 5) {
validChoice = true;
} else if (emp.getClass().equals(sales) && choice <= 6) {
validChoice = true;
} else if (emp.getClass().equals(manager)) {
validChoice = true;
} else {
StdOut.println("You entered an invalid number! Try Again...");
validChoice = false;
}
}
} while (!validChoice);
switch (choice) {
case 0:
StdOut.println("You are now exiting...");
exit = true;
break;
case 1:
StdOut.println("The employees first name is: " + emp.getFirstName() + ". What would you like the first name to be now?");
newName = StdIn.readString();
StdOut.println("Are you sure you want to change " + emp.getFirstName() + " to " + newName +"?(y/n)");
sure = ynChoice();
if(sure) emp.setFirstName(newName);
break;
case 2:
StdOut.println("The employees last name is: " + emp.getLastName() + ". What would you like the last name to be now?");
newName = StdIn.readString();
StdOut.println("Are you sure you want to change " + emp.getLastName() + " to " + newName +"?(y/n)");
sure = ynChoice();
if(sure) emp.setLastName(newName);
break;
case 3:
StdOut.println("The employees hourly rate is: " + emp.getHourlyRate() + ". What would you like the hourly rate to be now?");
newValue = StdIn.readDouble();
StdOut.println("Are you sure you want to change " + emp.getHourlyRate() + " to " + newValue +"?(y/n)");
sure = ynChoice();
if(sure) emp.setHourlyRate(newValue);
break;
case 4:
StdOut.println("The employee has worked: " + emp.getHoursWorked() + " hours in the last week. What would you like that to be now?");
newValue = StdIn.readDouble();
StdOut.println("Are you sure you want to change " + emp.getHoursWorked() + " to " + newValue +"?(y/n)");
sure = ynChoice();
if(sure) emp.setHoursWorked(newValue);
break;
case 5:
if (emp.getClass().equals(admin)) {
StdOut.println("The employees fixed bonus is: " + emp.getFixedBonus() + ". What would you like that to be now?");
newValue = StdIn.readDouble();
StdOut.println("Are you sure you want to change " + emp.getFixedBonus() + " to " + newValue +"?(y/n)");
sure = ynChoice();
if(sure) emp.setHoursWorked(newValue);
} else if (emp.getClass().equals(sales)) {
StdOut.println("The employees percentage bonus is: " + emp.getPercentageBonus() + ". What would you like that to be now?");
newValue = StdIn.readDouble();
StdOut.println("Are you sure you want to change " + emp.getPercentageBonus() + " to " + newValue +"?(y/n)");
sure = ynChoice();
if(sure) emp.setHoursWorked(newValue);
} else if (emp.getClass().equals(manager)) {
StdOut.println("The employees fixed bonus is: " + emp.getFixedBonus() + ". What would you like that to be now?");
newValue = StdIn.readDouble();
StdOut.println("Are you sure you want to change " + emp.getFixedBonus() + " to " + newValue +"?(y/n)");
sure = ynChoice();
if(sure) emp.setHoursWorked(newValue);
}
break;
case 6:
StdOut.println("The employees sales in the last week are: " + emp.getLastWeeksSales() + ". What would you like that to be now?");
newValue = StdIn.readDouble();
StdOut.println("Are you sure you want to change " + emp.getLastWeeksSales() + " to " + newValue +"?(y/n)");
sure = ynChoice();
if(sure) emp.setHoursWorked(newValue);
break;
}
} while (!exit);
return emp;
}
我认为instanceof关键字在您的情况下可能很有用。
ArrayList<Employee> list; // This is initialized and has Employees
for (Employee person: list) {
if (person instanceof Admin) {
int fixedBonus = ((Admin) person).getFixedBonus();
// Do something here
}
}
这是否回答你的问题? (您不需要.getClass()。equals(),这就是instanceD用于:D的原因)
您应该将getFixedBonus()
和getPercentBonus()
方法添加到您的员工中,每个方法返回0。然后其他worker类可以覆盖它们。
实际上,一种更好的技术是使其成为一个interface
并使所有类(包括Employee
)都实现该interface
。 然后,他们可以extend
一个base
类,该base
类也实现接口但提供默认值。
public static interface Staff {
public double getFixedBonus ();
public double getPercentageBonus ();
public List<Staff> getMinions();
}
// Base class - no bonus by default.
public static class Worker implements Staff {
@Override
public double getFixedBonus() {
return 0;
}
@Override
public double getPercentageBonus() {
return 0;
}
@Override
public List<Staff> getMinions() {
return Collections.EMPTY_LIST;
}
}
public static class Administrator extends Worker implements Staff {
double fixedBonus = 2.13;
@Override
public double getFixedBonus() {
return fixedBonus;
}
}
public static class Salesperson extends Worker implements Staff {
double percentageBonus = 3.14;
@Override
public double getPercentageBonus() {
return percentageBonus;
}
}
public static class Manager extends Worker implements Staff {
List<Staff> minions;
@Override
public List<Staff> getMinions() {
return minions;
}
}
不要被使用instanceof
和cast的阴暗面所吸引。 您会后悔您的决定。 oop的全部要点是,即使您不知道您正在处理哪种对象,也仍然可以使用它们。
(和清洁-的instanceof和铸造是丑陋的),使您的客户端代码有很多更为简单的选择是声明一个默认的实现为每个具体的方法Employee
,例如,用于返回零fixedBonus()
的Employee
,但在覆盖它Sales
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.