2016-11-05 29 views
0

我有一个读取各种员工信息的文本文件。 我已经创建了两个基于Employee对象年的数组列表。员工有两个子类,推销员和执行者。我不知道我应该怎么用逗号,如果有两个子类拆分它,因为我不能调用超类不确定是否应该拆分我的子类

这里的员工类

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

对不起。我想知道是否应该为所有三个类使用split方法,或者只为超类使用split方法。我也想知道如果我仍然需要为我的子类构造函数调用超类。 – Matt

回答

0

分裂法你的意思是解析该文件的东西,我觉得你应该把这个登录另一个类,什么都没有做员工。

这可能是类似ParseEmployeeFile或ScanEmpoyeeFile,具有方法解析()扫描()

此方法应返回标准记录,列表或地图,取决于您的需求。

从这个记录你应该能够创建适当的员工。

要做到这一点,您需要所谓的工厂类。

这是一个包含创建适当的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")); 
    } 
} 

根据需要这可以被改善。

+0

事情是这是一个班级的任务,我们只需要写四个班级,并根据员工加入的年份将数据存储在两个数组中 – Matt

+0

@Matt我非常怀疑您的老师会告诉您如果你真的去了一个额外的步骤,你做了一个糟糕的工作。 –

+0

@Matt没问题,使用Factory方法,而不是类。您可以将该方法作为静态方法放在Employee超类中。对于解析器部分,您可以在主类中实现此方法。当然Record可以是List或Map,不需要特定的类型。 –

0

我猜输入的文本文件中包含行,每个行都包含一个雇员与逗号连接的信息,如csv文件。

在我看来,你不应该在雇员及其子类代码中使用String#split()。在阅读成功完成的文件后,将每行分割为每个属性(如name和monthlySalary),然后将它们传递给Employee或其子类的构造函数。

通过明确区分获取文件的信息和制作Employee对象,Employee类变成了robuster。例如,请假设信息创建来自其他格式(如xml文件)的Employee对象?如果您在Employee的构造函数中调用String#split(),则无法轻松应对!

相关问题