2016-11-05 5 views
0

У меня есть текстовый файл, который читается в информации различных сотрудников. Я создал два списка массивов, которые основаны на годах объекта Employee. Сотрудник имеет два подкласса: продавец и исполнительный директор. Я задаюсь вопросом, как я должен разделить его запятыми, если есть два подкласса, так как я не могу назвать супер классНеуверенный, если я должен разделить мои подклассы

Вот класс 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 для всех трех классов или только для суперкласса. Мне также интересно, нужно ли мне ещезывать суперкласс для моих конструкторов подкласса. – Matt

ответ

0

Я с методом расщепленного вы имеете в виду то, что синтаксический анализ файла, я думаю, вы должны поместить этот логин в другом классе, которые не имеют ничего общего с Работником.

Это может быть что-то вроде ParseEmployeeFile или ScanEmpoyeeFile, с методом синтаксического анализа() или сканирования().

Этот метод должен возвращать стандартную запись, список или карту, в зависимости от ваших потребностей.

С этой записи вы сможете создать надлежащего сотрудника.

Для этого вам понадобится так называемый класс 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")); 
    } 
} 

Это может быть улучшена по мере необходимости.

+0

Дело в том, что это назначение для класса, и мы должны писать только четыре класса и хранить данные в двух массивах в зависимости от года, когда сотрудник присоединился к – Matt

+0

@Matt. Я очень сомневаюсь, что ваш учитель скажет вы, что вы сделали плохую работу, если вы действительно сделаете дополнительный шаг. –

+0

@Matt не проблема, используйте метод Factory, а не класс. Вы можете применить метод в суперклассе Employee как статический метод. А для части Parser вы можете реализовать этот метод в своем основном классе. И Record может быть List или Map, конечно, не нужен определенный тип. –

0

Я думаю, что входной текстовый файл содержит строки, и каждый из них состоит из информации сотрудника, объединенного запятыми, например, csv-файла.

На мой взгляд, вы не должны использовать String#split() в Employee и его подклассах. После успешного завершения чтения файла разделите каждую строку на каждый атрибут (например, name и monthSalary), а затем передайте их конструкторам Employee или его подклассам.

Четко различая получение информации о файле с созданием объектов Employee, класс Employee становится роботом. Например, предположите, что информация для создания объектов Employee получена из другого формата (например, XML-файла)? Вы не можете справиться с этим легко, если вы вызываете String#split() внутри конструктора Employee!