我有一个文本文件,可以读取各种员工的信息。 我创建了两个基于Employee对象年份的数组列表。 Employee有两个子类,Salesman和Executive。我想知道如果有两个子类我应该用逗号分割它,因为我不能调用超类
这是员工类
public class Employee
{
private String name;
private double monthlySalary;
public Employee(String line)
{
String[]split=line.split(",");
name=split[0];
monthlySalary=Double.parseDouble(split[1]);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMonthlySalary() {
return monthlySalary;
}
public void setMonthlySalary(double monthlySalary) {
this.monthlySalary = monthlySalary;
}
public double annualSalary()
{
return monthlySalary*12;
}
public String toString()
{
String str;
str="Name: "+name;
str+="\nMonthly Salary: "+monthlySalary;
return str;
}
}
推销员类
public class Salesman extends Employee
{
private double annualSales;
public Salesman(String name, double monthlySalary, double annualSales)
{
super(name,monthlySalary);
this.annualSales=annualSales;
}
public double getAnnualSales() {
return annualSales;
}
public void setAnnualSales(double annualSales) {
this.annualSales = annualSales;
}
public double annualSalary()
{
double commision=annualSales*0.02;
if (commision>20000)
{
commision=20000;
}
double totalSalary=super.annualSalary()+commision;
return totalSalary;
}
public String toString()
{
return super.toString()+"\nAnnual Sales: "+annualSales;
}
}
行政级别
public class Executive extends Employee
{
private double stockPrice;
public Executive(String name, double monthlySalary, double stockPrice)
{
super(name,monthlySalary);
this.stockPrice=stockPrice;
}
public double getStockPrice() {
return stockPrice;
}
public void setStockPrice(double stockPrice) {
this.stockPrice = stockPrice;
}
public double annualSalary()
{
double bonus=0;
if(stockPrice>50)
{
bonus=30000;
}
double totalSalary=super.annualSalary()+bonus;
return totalSalary;
}
public String toString()
{
return super.toString()+"\nStock Price: "+stockPrice;
}
}
和驱动程序类
import java.io.*;
import java.util.*;
public class employeeDriver
{
public static void main(String[] args)
{
String input;
Scanner readInput=null;
Scanner readFile = null;
try
{
readFile=new Scanner(new File("C:\\mywork\tester.txt"));
}
catch(FileNotFoundException e)
{
System.out.println("The file can't be opened");
System.exit(0);
}
List<Employee> firstList= new ArrayList<>();
List<Employee> secondList= new ArrayList<>();
while(readFile.hasNextLine())
{
//To be inserted
}
}
}
答案 0 :(得分:0)
我使用拆分方法你的意思是解析文件,我认为你应该把这个登录放在另一个与Employee无关的类中。
这可能类似于ParseEmployeeFile或ScanEmpoyeeFile,方法是 parse()或 scan()。
此方法应返回标准记录,列表或地图,具体取决于您的需求。
从这条记录中你应该能够创建合适的员工。
为此,您需要所谓的Factory类。
这是一个包含创建适当的Employee子类对象的逻辑的类。
例如:
class EmployeeFactory {
public static Employee create(Record record) {
if (record.get("annualSales") != null) {
return new Salesman(record.get("name"),
record.get("monthlySalary"),
record.get("annualSales"));
}
if (record.get("stockPrice") != null) {
return new Executive(record.get("name"),
record.get("monthlySalary"),
record.get("stockPrice"));
}
return new Employee(record.get("name"),
record.get("monthlySalary"));
}
}
这可以根据需要进行改进。
答案 1 :(得分:0)
我猜输入文本文件包含行,每个行都包含一个与逗号连接的员工信息,如csv文件。
在我看来,你不应该在Employee及其子类代码中使用String#split()
。读取文件成功完成后,将每一行拆分为每个属性(如name和monthlySalary),然后将它们传递给Employee或其子类的构造函数。
通过明确区分获取文件信息和制作Employee对象,Employee类成为robuster。例如,请假设创建Employee对象的信息来自另一种格式(如xml文件)?如果你在Employee的构造函数中调用String#split()
,就无法轻易应对这一点!