2016-11-05 3 views
0

다양한 직원의 정보를 읽는 텍스트 파일이 있습니다. Employee 객체의 연도를 기반으로 두 개의 배열 목록을 만들었습니다. Employee에는 Salesman과 Executive라는 두 개의 하위 클래스가 있습니다. 나는 두 개의 서브 클래스를 만약 거기에 슈퍼 클래스 다음하위 클래스를 분할해야하는지 잘 모르겠 음

를 호출 할 수 없기 때문에 나는 쉼표로를 분할하는 방법 궁금하면 세일즈맨 클래스

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 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 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

이것은 클래스에 대한 과제이며, 우리는 4 개의 클래스 만 작성하고 직원이 합류 한 연도를 기준으로 두 개의 배열에 데이터를 저장해야합니다. – Matt

+0

@Matt 선생님이 실제로 당신이 여분의 조치를 취한다면 당신은 나쁜 직업을 얻었습니다. –

+0

@Matt 문제가 없으므로 클래스 대신 Factory 메서드를 사용하십시오. 메소드를 Employee 수퍼 클래스에 정적 메소드로 넣을 수 있습니다. 그리고 Parser 부분에 대해서는 메인 클래스에서이 메소드를 구현할 수 있습니다. 물론 레코드는 목록 또는지도 일 수 있습니다. 특정 유형이 필요하지 않습니다. –

0

입력 텍스트 파일에는 줄이 포함되어 있고 각 줄에는 csv 파일과 같이 쉼표로 연결된 직원의 정보가 포함되어 있다고 생각합니다.

제 생각에는 직원 및 해당 하위 클래스 코드에 String#split()을 사용하지 않아야합니다. 성공한 파일을 읽은 다음 모든 행을 각 속성 (예 : name 및 monthlySalary)으로 분할 한 다음 Employee 또는 그 하위 클래스의 생성자로 전달합니다.

Employee 객체를 만들면서 파일의 정보를 명확하게 구분함으로써 Employee 클래스가 더욱 강력 해졌습니다. 예를 들어, Employee 객체를 생성하기위한 정보가 XML 파일과 같은 다른 형식에서 왔다고 가정하십시오. 직원의 생성자 안에 String#split()을 호출하면 쉽게 대처할 수 없습니다!

관련 문제