2015-10-15 3 views
0

Как добавить ввод в HashSet в заданной задаче. В основном я хочу использовать addEmployee, removeEmployee, методы printEmployee в классе менеджера, но я не могу понять, что писать в основном методе, так что методы addEmployee, removeEmployee и printEmployee класса диспетчера вызываетсяРеализация метода в Java

public class EmployeeTest 
{ 
    public static void main(String[] args) 
    { 
     Manager mgr = new Manager(207, "Barbara Johnson", "054-12-2367", 109_501.36, "US Marketing"); 
     Employee e=new Employee(127, "Kyle Jenner", "023-42-5368", 123_243.90); // newly edited 
     mgr.addEmployee(e); //newly edited 
     mgr.printEmployee(e); //newly edited 
     printEmployee(mgr); 
    } 
    public static void printEmployee(Employee emp) 
    { 
     System.out.println(); 
     System.out.println("Employee id:   " + emp.getEmpId()); 
     System.out.println("Employee name:  " + emp.getName()); 
     System.out.println("Employee Soc SeC#: " + emp.getSsn()); 
     System.out.println("Employee salary:  " + NumberFormat.getCurrencyInstance().format((double) emp.getSalary()));   
    } 
} 

public class Employee 
{ 
    private int Id; 
    private String name; 
    private String ssn; 
    private double salary; 
    public Employee(int Id, String name, String ssn, double salary) 
    { 
    this.Id = Id; 
    this.name = name; 
    this.ssn = ssn; 
    this.salary = salary; 
    } 
    public int getEmpId() 
    { 
    return Id; 
    } 
    public String getName() 
    { 
    return name; 
    } 
    public String getSsn() 
    { 
    return ssn; 
    } 
    public double getSalary() 
    { 
    return salary; 
    } 
    public void setName(String name) 
    { 
    if (name != null && !name.equals("")) 
    { 
     this.name = name; 
    } 
    } 
    public void raiseSalary(double increase) 
    { 
    if (increase > 0) 
    { 
     salary += increase; 

    } 
    } 
} 

public class Manager extends Employee 
{ 
    private String dept; 
    public Manager(int Id, String name, String ssn, double salary, String dept) 
    { 
    super(Id, name, ssn, salary); 
    this.dept = dept; 
    } 
    **private Set<Employee> staff=new HashSet<>();** //This is where I need help 
    **public void addEmployee(Employee e)** //This is where I need help 
    { 
    staff.add(e); 
    } 
    **public void removeEmployee(Employee e)** //This is where I need help 
    { 
    staff.remove(e); 
    } 
    **public void printEmployee(Employee e)** //This is where I need help 
    { 
    for (Employee emp: staff) 
    { 
     System.out.println("Name : "+getName()+" "+"ID : "+getEmpId()); 
    } 
    } 
    public String getDeptName() 
    { 
    return dept; 
    } 
} 

Выход из программы

название: Барбара Джонсон ID: 207 // Желаемая Вывод: - имя: Кайли Дженнер ID: 127

Сотрудник ID: 207

имя сотрудника: Барбара Джонсон

Сотрудник Soc SeC#: 054-12-2367

Сотрудник зарплата: Rs.109,501.36

Тестирование raiseSalary и SetName на менеджера:

Сотрудник идентификатор: имя 207

сотрудников: Барбара Джонсон-Смайт

Работник Soc Sec: 054-12-2367

сотрудников зарплата: Rs.119,501.36

+0

Вы можете ... создать некоторых сотрудников, а затем вызвать методы типа 'mgr.addEmployee (myEmployee)' ... –

+0

Я сделал так, как вы просили ..... создал экземпляр класса employee, а затем вызвал методы в главный метод, как вы сказали, но он добавляет и печатает одно и то же имя и идентификатор, т. е. Барбара Джонсон в этом случае – user5451270

+0

Можете ли вы показать свой текущий код и вывод? В противном случае мы должны угадать. В приведенном выше коде запрашивается, чтобы менеджер печатался, потому что вы вызываете 'EmployeeTest.printEmployee()', а не 'Manager.printEmployee() '. Если вы хотите, чтобы сотрудники менеджера печатались, используйте 'mgr.printEmployee()'. –

ответ

0

Вашего выход показывает название менеджеров, потому что Manager.printEmployee() звонит получить getName() и getEmpID() на менеджер объекта , а не на своих сотрудниках.

**public void printEmployee(Employee e)** //This is where I need help 
{ 
    for (Employee emp: staff) 
    { 
    System.out.println("Name : "+getName()+" "+"ID : "+getEmpId()); 
    } 
} 

(Кроме того, этот метод получает ссылку e на объект Employee, который он затем игнорирует.)

Вспомните, как вы изменили printEmployee(e); к mgr.printEmployee(e); для вызова метода на объекте диспетчера, на который ссылается MGR? Вам нужно будет сделать то же самое, чтобы вызвать метод на объектах Employee.

public class Manager extends Employee { 
    **public void printEmployee()** //This is where I need help 
    { 
     for (Employee emp: staff) 
     { 
     System.out.println("Name : "+emp.getName()+" "+"ID : "+emp.getEmpId()); 
     } 
    } 
    ... 

Вот что нужно помнить. Вы не просто называете набор функций. Вы взаимодействуете с объектами, вызывая методы на них. Если вы хотите взаимодействовать с объектом, вы должны вызывать методы посредством ссылки на этот объект - как вы это делали с mgr.addEmployee() в методе main().

+0

спасибо, что решил мою проблему. еще одна вещь, которую я хотел спросить, может ли мы опустить объект класса. например, «Employee e = новый Employee (что-то ...)», а затем «Менеджер mgr1 = (менеджер) e' и, наконец,« mgr1.addEmployee (e) »и« mgr1.printEmployee (e) », но проблема когда я пытаюсь выполнить этот код, он выдает ошибку исключения исключений класса. – user5451270

+0

Нет, вы не можете этого сделать. Кастинг только изменяет тип ссылки, а не тип объекта, к которому относятся контрольные точки. Во время компиляции синтаксис является законным, потому что 'e' * может * указывать на объект Manager во время выполнения. Но во время выполнения, когда вы пытаетесь выполнить кастинг, Java обнаруживает, что 'e' в настоящее время не указывает на объект Manager. Так как код не может делать то, что он просил сделать, он выдает исключение. [Если вы знакомы с C++, хотя синтаксис похож на исходные роли, поведение ближе к dynamic_cast() ссылки.] –

1

Поскольку статический типа эх в printEmployee() является Employee вы можете использовать только метод, которые определяются в Employee (или определенные там и перекрываться в Manager). Поскольку printEmployee() определяются в Manager он может быть использован только в переменном declaed, как Manager