2013-09-05 2 views
0

내 코드에 문제가 있습니다. . 이것은 우리의 과제이다.재정의하고 상속

는 "clsWorker과 서브 클래스 clsHourlyWorker 및 clsSalariedWorker라는 이름의 슈퍼 클래스를 작성 모든 노동자의 이름과 급여 율이있는 모든 근로자를위한 주간 급여를 계산하는 방법 computePay (INT 시간)을 작성합니다. 시간당 근로자가 시간이 40 시간을 초과하면 근무 시간의 실제 시간당 시간당 임금이 지급됩니다. 시간당 근로자가 40 시간 이상 근무한 경우 초과 근무는 시간당 0.5 달러가 지급됩니다. 실제 시간 수에 관계없이 40 시간 동안 임금 상속을위한 테스트 프로그램 작성 노동자의 이름, 근무 시간 수 및 근로자 유형, 시간당 H 및 급여 S를 입력하십시오. 근로자의 급여율. 입력 한 모든 근로자의 급여를 표시하십시오. "

재정의와 상속이 필요합니다.

 public class clsWorker 
{ 
    int hours=0,excess=0; 
    double salary,newSalary=0.0; 
    String sType; 


    public clsWorker() 
    { 

    } 

    public clsWorker(double sal,String type) 
    { 
     //this.hours=hours; 
     salary=sal; 
     sType=type; 
    } 

    public double computePay(int hours) 
    { 
     sType=sType.toUpperCase(); 
     if(sType.equals("H"))  
     newSalary=(salary*hours)*7; 
     else if(sType.equals("S")) 
     { if(hours>=40) 
      newSalary=salary*40; 
      else if(hours>40) 
      { 
      excess=hours-40; 
      newSalary=(newSalary+((newSalary*excess)*1.5))*7; 
      } 
     } 
     return newSalary;  
    } 


} 

내 서브 클래스

public class clsHourlyWorker extends clsWorker 
    { 
     double dSalary=0.0; 
     int iHours=0; 

     public clsHourlyWorker() 
     { 
      //super(); 
     } 

     public clsHourlyWorker(int iHours, double salaryph,String sRate) 
     { 

      super(iHours,salaryph,sRate); 
      //clsWorker w=new clsWorker(); 
      dSalary=newSalary; 

     } 




     public double getSalary() 
     { 
      return dSalary; 
     } 
    } 

public class clsSalariedWorker extends clsWorker 
{ 
    double dSalary=0.0; 
    int iHours=0; 

    public clsSalariedWorker() 
    { 
     //super(); 
    } 

    public clsSalariedWorker(int iHours,double salaryph,String sRate) 
    { 

     super(iHours,salaryph,sRate); 
     //super(salaryph,sRate); 
     //this.iHours=iHours; 
     //clsWorker w=new clsWorker(); 
     dSalary=newSalary; 
    } 

    /*public void setSalary(int iHourjs) 
    { 

    }*/ 

    public double getSalary() 
    { 
     return dSalary; 
    } 
} 

내 테스트 클래스

import java.util.*; 

public class testSalary 
{ 

    public static void main(String[]args) 
    { 


     Scanner console=new Scanner(System.in); 

     System.out.println("Input Salary per hour: "); 
     double salaryph=console.nextDouble(); 
     System.out.println("Input number of hours: "); 
     int iHours=console.nextInt(); 
     console.nextLine(); 
     System.out.println("Input Worker Name: "); 
     String sName=console.nextLine(); 
     System.out.println("Input Type of Worker: "); 
     String sRate=console.next(); 


     clsHourlyWorker hw=new clsHourlyWorker(iHours,salaryph,sRate); 
     clsSalariedWorker sw=new clsSalariedWorker(iHours,salaryph,sRate); 

     //System.out.println("Worker Name: "+sName+"\nSalary: "+hw.getSalary()); 
     if(sRate.equals("H")) 
     System.out.println("Worker Name: "+sName+"\nSalary: "+hw.getSalary()); 
     else if (sRate.equals("S")) 
     System.out.println("Worker Name: "+sName+"\nSalary: "+sw.getSalary()); 


    } 

} 

사람이 어떻게 내 문제를 해결하기 위해 말해 줄 수 : 난 항상 NoSuchMethodError

내 슈퍼 클래스가 발생? 감사.

+0

오류의 원인은 무엇입니까? –

+3

정말 당신의 실제 과제 텍스트입니까? 그렇다면 Java 명명 규칙을 따르지 않는 것이 유감입니다. 클래스 이름은 대문자로 시작해야합니다. –

+1

당신의'clsWorker'는 실제로 추상적으로 만들어 져야한다고 생각합니다. –

답변

2

이 이해가되지 않습니다 : 문자열, 더블, int로 나타내는 이름, dRate 및 시간을 슈퍼 클래스의 생성자가 INT 두 번, 그리고 문자열을하지 않는 것이 아니라,이 걸리므로

public clsHourlyWorker(int iHours, double salaryph,String sRate) 
    { 

     super(iHours,salaryph,sRate); 
     //clsWorker w=new clsWorker(); 
     dSalary=newSalary; 

    } 

. 또한 실제로 sRate는 문자열으로되어 있습니까? 나는 그것을 강력하게 의심한다.

당신의 하위 클래스 생성자가 슈퍼 생성자 (이름은 Strinng, 몇 시간은 dRate와 int의 두 배)와 새로운 매개 변수 클래스의 추가 정보에 대한 추가 매개 변수에 필요한 모든 정보를 매개 변수로 허용하는 것이 좋습니다. 일부 필드는 수퍼 필드와 중복되므로 불필요한 것으로 보이기 때문에 해당 필드를 다시 생각할 수 있습니다.

2

은 몇 가지가 개선 될 수 :

사용 상속

간단히 말하자면, 당신은 모든 상속의 힘을 활용하지 않는 게시 된 코드입니다. 두 개의 하위 클래스를 만들었지 만 지불 계산을 다시 수퍼 클래스에 위임합니다. 서브 클래스의 방법의 두 가지 버전을, clsWorker 추상적 확인 computePay 추상적하고 구현 :

public abstract class Worker { 
    // ... 
    public abstract double computePay(int hours); 
} 

public class HourlyWorker extends Worker { 
    // ... 
    @Override 
    public double computePay(int hours) { 
     // code from the 'sType.equals("H")' block 
    } 
} 

public class SalariedWorker extends Worker { 
    // ... 
    @Override 
    public double computePay(int hours) { 
     // code from the 'sType.equals("S")' block 
    } 
} 

지금 당신은 또한 필드 sType가 어떤 유용한 목적으로 제공되지 않는다는 것을 알게 될 것이다. 사실이 접근법은 Java에서 다형성을 지원하지 않는 경우에만 필요합니다.의 computePay 또는 SalariedWorkercomputePay에 코드를 넣었으므로 (코드 작성시) 이미 HourlyWorker 또는 SalariedWorker를 사용하고 있는지 알고있을 것입니다.

sType은 상속 계층 구조를 보면 알 수없는 새로운 정보를 제공하지 않습니다. 이렇게하면 똑같은 정보를 두 번 (상속으로 한 번, 한 번 sType으로) 제공합니다. 이는 소프트웨어 개발에서 일반적으로 피하려고하는 것입니다.

"테스트"클래스를 개선

(대부분의 개발자는 "테스트"클래스에서, 당신은 자동화, 단위 테스트 "테스트"어떤 종류의 의미라고 생각 때문에 나는 따옴표 "테스트"를 넣어 - 예 JUnit을 테스트 케이스)

이상한 것입니다

우선 :. 왜 HourlyWorker과 SalariedWorker (즉 new clsHourlyWorker, new clsSalariedWorker 모두의 인스턴스), 사용자가 선택하거나 만들 수 있습니다 경우 HourlyWorker 또는 전에 SalariedWorker (하지만 모두 , 이것은 '독점 또는'입니까?)

은 당신이 정말 원하는 것은의 라인을 따라 뭔가 : 당신이 볼 수 있듯이

Worker w; 
    if(sRate.equals("H")) 
     w = new HourlyWorker(iHours,salaryph); 
    else if (sRate.equals("S")) 
     w = new SalariedWorker(iHours,salaryph); 
    else 
     throw new Exception("Don't recognize worker type: " + sRate); 

    System.out.println("Worker Name: "+sName+"\nSalary: "+w.getSalary()); 

, 당신의 노동자 인스턴스 변수, w의 유형으로 추상 슈퍼 클래스를 Worker 사용하는 것이 유효하다 당신이 만약 돈 사용자가 H 또는 S을 선택할 지 여부는이 시점 (런타임 중)에서 알 수 없습니다. Worker에 선언 된 getSalary에 액세스하면되므로 아무 문제가 없습니다. (나중에 하위 클래스에 의해서만 구현되는 메소드에 액세스해야한다면 여전히 타입 캐스트 할 수 있습니다.)

println 중 하나만 필요하다는 것도 알 수 있습니다. 다시 말하지만, 우리는 추상화를 위해 중복을 최소화하고자합니다. 두 행은 기본적으로 동일하며, 작업자의 이름과 계산 된 급여를 인쇄하므로 두 행을 하나의 추상 행으로 줄이려고합니다.

두 번째로 sName을 직접 인쇄하는 대신 getter (getName)를 Worker에 넣고 싶을 수도 있습니다. 더 큰 프로젝트를 작업 할 때 입력과 출력이 매우 다른 시간과 장소에서 일어날 수 있습니다 (예 : Worker이 데이터베이스에 저장 될 수 있으며 원래 변수 sName은 다른 사용자가 데이터베이스에서 Worker). 따라서 테스트 입력이 아닌 실제 개체에서 필요한 모든 데이터를 가져올 수 있도록 준비하십시오.

셋째 -하지만 내가 여기 착각 될 수 있습니다 - 당신은 사용자가 여러 노동자를 입력 할 수있는 while 루프를 구현되어있는 것처럼 "모든 노동자가 입력 의 급여를 표시"나에게 소리. 그러나이 과제에서 배울 수있는 중요한 것들이 있습니다.

따르 명명 규칙

자바에서

, 대문자 클래스 이름 및 소문자 방법 이름이 매우 일반적이다. 일반적으로 Worker, HourlyWorker 및 SalariedWorker가 있습니다 (위의 코드 샘플 참조). 이 방법으로, 세계의 모든 자바 개발자는 이미 우리가 클래스에 대해 이야기하고 있다고 말할 수 있습니다.

그러나 과제를 수행하기 위해 임의의 "규칙"을 따르는 것이 좋습니다. 표준 Java 방식이 아니라는 점을 명심하십시오. 실제 프로젝트에서 이렇게하기 전에 명명 규칙 (일반 및 특정)을 읽어보십시오.

관련 문제