簡體   English   中英

Java,似乎找不到與我的繼承有關的問題

[英]Java, Cannot seem to find issue with my inheritence

我正試圖找出我的問題。

由於某些原因,當我嘗試設置銷售人員的銷售時,它只會將第一個SalesPerson建立的銷售設置為最后一個Salesperson銷售。

在這里,EmployeeDatabase擁有EmployeeList,這是Employees類型的容器對象。

我有其他班級的代碼,但我認為這是所有需要的...很抱歉,代碼中缺少注釋

我的輸出:

John 12000.0
Set sales to: 12000.0
Joan 10000.0
Set sales to: 10000.0
Jack 5000.0
Set sales to: 5000.0
Name: John           Commision: 0.03 Sales: 5000.0
Name: Joan           Commision: 0.04 Sales: 0.0
Name: Jack           Commision: 0.02 Sales: 0.0

Payroll: 150.0

代碼:EmployeeDatabase

public class EmployeeDatabase 
{

public static void main(String[] args) 
{
    EmployeeList emp = new EmployeeList();
    /*emp.enqueue(new SalesManager("Gee", 1000));
    emp.enqueue(new SalesManager("Gal", 1000));
    emp.enqueue(new SalesManager("Gem", 1000));*/
    emp.enqueue(new SalesPerson("John", 0.03));
    emp.enqueue(new SalesPerson("Joan", 0.04));
    emp.enqueue(new SalesPerson("Jack", 0.02));
    /*emp.enqueue(new Manager("Fred", 10000));
    emp.enqueue(new Manager("Frank", 5000));
    emp.enqueue(new Manager("Florence", 3000));
    emp.enqueue(new Programmer("Linda", 7));
    emp.enqueue(new Programmer("Larry", 5));
    emp.enqueue(new Programmer("Lewis", 3));*/

    /*emp.setHours("Linda", 35);
    emp.setHours("Larry", 23);
    emp.setHours("Lewis", 3);*/
    emp.setSales("John", 12000);
    emp.setSales("Joan", 10000);
    emp.setSales("Jack", 5000);
    /*emp.setSales("Gee", 4000);
    emp.setSales("Gal", 3000);
    emp.setSales("Gem", 2000);
    emp.setSalary("Gee", 1000);
    emp.setSalary("Gal", 2000);
    emp.setSalary("Gem", 3000);*/
    emp.display();
}
}

EmployeeList的

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;


public class EmployeeList 
{
Queue<Employee> empList = new LinkedList<Employee>();

Employee find(String nm)
{
    Iterator<Employee> it = empList.iterator();
    while(it.hasNext())
    {
        Employee em = (Employee)it.next();
        if(!em.name.equals(nm))
        {
            return em;
        }   
    }
    return null;
}

double payroll()
{
    double payroll = 0.0;
    Iterator<Employee> it = empList.iterator();
    while(it.hasNext())
    {
        Employee em = (Employee)it.next();
        payroll += em.computePay(); 
    }
    return payroll;
}

void display()
{
    Iterator<Employee> it = empList.iterator();
    while(it.hasNext())
    {
        Employee em = (Employee)it.next();
        em.display();   
    }
    System.out.println("\nPayroll: " + payroll());
}

void enqueue(Employee e)
{
    empList.add(e);
}

void setHours(String nm, int hrs)
{
    Employee em = find(nm);
    /*if(em == null)
        return;*/
    em.setHours(hrs);
}

void setSalary(String nm, float salary)
{
    Employee em = find(nm);
    /*if(em == null)
        return;*/
    em.setSalary(salary);
}

void setSales(String nm, double sales)
{
    System.out.println(nm + " " + sales);
    Employee em = find(nm);
    /*if(em == null)
        return;*/
    em.setSales(sales);
}
}

雇員

abstract class Employee 
{
String name;

Employee() {}
Employee (String nm) { name = nm; }
abstract double computePay();
void display () {}
void setHours(double hrs) {}
void setSales(double sales) {}
void setSalary(double salary) { System.out.println("NO!"); }
 }

WageEmployee

public class WageEmployee extends Employee 
{
double rate;
double hours;

WageEmployee(String name)
{
    this.name = name;
    if(this.name.length() < 14)
    {
        while(this.name.length() < 14)
        {
            this.name += " ";
        }
    }
}
WageEmployee(String name, double rate)
{
    this.name = name;
    if(this.name.length() < 14)
    {
        while(this.name.length() < 14)
        {
            this.name += " ";
        }
    }
    this.rate = rate;
}

double computePay()
{
    return rate * hours;
}

void setHours(double hrs) 
{
    hours = hrs;
    System.out.println("Set Hours to: " + hours);
}

 void display () 
 {
     System.out.println("Name: " + name + " Hours: " + hours + " Rate: " + rate);
 }
}

業務員

public class SalesPerson extends WageEmployee 
{
double comission;
double salesMade;

SalesPerson(String name, double commision) 
{
    super(name);
    this.comission = commision;
}

double computePay()
{
    return comission * salesMade;
}

void setSales(double sales) 
{
    salesMade = sales;
    System.out.println("Set sales to: " + salesMade);
}

void display () 
 {
     System.out.println("Name: " + name + " Commision: " + comission + " Sales: " + salesMade);
 }
}

在這段代碼中有兩個問題。

首先,有額外的! 在查找方法中。

if(!em.name.equals(nm))應該是if(em.name.equals(nm))

第二個問題是您的工資雇員構造函數中創建的填充。

if(this.name.length() < 14)
{
    while(this.name.length() < 14)
    {
        this.name += " ";
    }
}`

此代碼,以使"John"你正在尋找的其實是"John " 注意間距。 (射擊,降價消除了其中的大部分,但您最終想到了額外的間距)。 這將導致名稱永遠不會相等,從而導致在嘗試使用不存在的員工時出現空指針異常。

有三種可能的解決方案。 首先,在比較之前對em.name使用String.trim方法。 第二,在比較之前,以與存儲搜索名稱相同的方式填充搜索名稱。 第三,您也許可以完全刪除填充(我不知道您的用例,但是String.format可能只允許您在輸出時填充)。

您的find方法中有一個錯誤:

Employee find(String nm)
{
    Iterator<Employee> it = empList.iterator();
    while(it.hasNext())
    {
        Employee em = (Employee)it.next();
        if(!em.name.equals(nm)) // should be if(em.name.equals(nm))
        {
            return em;
        }   
    }
    return null;
}

這將導致為以后的雇員調用setSales時返回第一個雇員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM