Вызов метода из консольного меню для класса, который наследует метод - PullRequest
0 голосов
/ 29 апреля 2020

Я наткнулся на проблему, и я не уверен, что мне не хватает. Здесь я добавлю много кода, большая часть которого, вероятно, не понадобится для ответа на мой вопрос.

У меня есть класс с именем Employee, это просто класс для объекта типа Employee:


class Employee extends ObjectIDs implements Output {

    private String firstName;
    private String lastName;

    private static final String VALID_EMPLOYEE_NAME = "^[a-zA-Z]{2,50}$";

    Employee(Integer id, String firstName, String lastName) throws Exception {
        super(id);
        this.setNames(firstName, lastName);
    }

    private void setNames(String firstName, String lastName) throws Exception {
        if ( !firstName.matches(VALID_EMPLOYEE_NAME) || !lastName.matches(VALID_EMPLOYEE_NAME)) {

            throw new IllegalArgumentException (Store.ERR_PREFIX+"Please use english letters only ");
        }
        this.firstName = firstName;
        this.lastName = lastName;
    }

    String getNames () {
        return this.firstName+" "+lastName;
    }

    public String createOutput() {
        return this.id+","+this.firstName+","+this.lastName;    
    }
}

У меня есть класс Store, внутри которого я создаю список сотрудников и кучу других вещей. Все методы для всех остальных классов go есть. Например, есть методы newEmployee и removeEmployee, которые получают доступ к списку, который я упомянул, et c. Он также будет включать другие методы для классов, таких как Product, но это только пример. Это класс Store:


class Store {

    private ArrayList<Employee> employees = new ArrayList<>();
    private ArrayList<Product> products = new ArrayList<>();

    static final String EMPLOYEES_FILE_PATH = "employees.csv";
    static final String PRODUCTS_FILE_PATH = "items.csv";
    static final String EMPLOYEES_LIST = "employees";
    static final String PRODUCT_LIST = "prodcuts";
    static final String ERR_PREFIX = "*********\nERROR\n*********\n";

    Employee newEmployee(Integer id ,String firstName, String lastName) throws Exception { //Create a new employee
        for ( Employee e : employees ) {
            if (id == e.id) {
                throw new IllegalArgumentException(ERR_PREFIX + "This employee ID already exist.");
            }
        }
        Employee e = new Employee(id, firstName, lastName);
        this.employees.add(e);
        System.out.println("Employee "+e.createOutput()+" added to the employees list");
        return e;
    }

    void deleteEmployee(Integer id) throws Exception { //Remove Employee
        for(int i = 0; i<employees.size(); i++) {
            if(employees.get(i).id == id) {
                System.out.println("Employee "+employees.get(i).createOutput()+" was deleted sucsessfully.");
                employees.remove(i);
                return;
            }
        }
        throw new IllegalArgumentException("Sorry, no such employee.");
    }
}

У меня есть другой класс, в котором я создаю меню. Это в основном меню, которое вызывает подменю, и оттуда я хочу выполнять методы.

import java.util.Scanner;

public class Menu {
    /**
     * @param args
     */
    public static void main(String[] args) {
        Menu menu = new Menu();
        menu = menu.mainMenu(menu);
        System.out.println("Thanks for visiting");
    }

    private Menu mainMenu(Menu menu) {
        System.out.println("Welcome to my store");
        int selection = 0;

        do {
            System.out.println("[1] I'm a customer");
            System.out.println("[2] I'm an employee");
            System.out.println("[3] Quit");

            System.out.print("Insert selection: ");
            Scanner sc = new Scanner(System.in);
            selection = sc.nextInt();

            switch (selection) {
            case 1: return menu.customerSubMenu(menu);
            case 2: return menu.employeeSubMenu(menu);
            case 3: return menu;
            default:
                System.out.println("The selection was invalid!");
            }
        } while (selection != 3);
        return menu;
    }

    private Menu customerSubMenu(Menu menu) { //Customer options submenu
        System.out.println("Welcome dear customer");

        int selection = 0;

        do {
            System.out.println("[1] Register as new customer");
            System.out.println("[2] Buy an item");
            System.out.println("[3] Return");

            System.out.print("Insert selection: ");
            Scanner sc = new Scanner(System.in);
            //selection = ++testint
            selection = sc.nextInt();

            switch (selection) {
            // case 1: return 
            // case 2: return 
            // case 3:
            default:
                System.out.println("The selection was invalid!");
        }
    } while (selection != 3);
    return menu;
}

private Menu employeeSubMenu(Menu menu) { //Employees options submenu
    System.out.println("Welcome employee");

    int selection = 0;

    do {
        System.out.println("[1] Add a product");
        System.out.println("[2] Return a product");
        System.out.println("[3] Add an employee");
        System.out.println("[4] Show all employees");
        System.out.println("[5] Return");

        System.out.print("Insert selection: ");
        Scanner sc = new Scanner(System.in);
        // selection = ++testint;
        selection = sc.nextInt();

        switch (selection) {
            // case 1: return
            // case 2: return
            // case 3: return
            case 5:
                return menu.mainMenu(menu);
            default:
                System.out.println("Invalid selection");
            }
        } while (selection != 5);
        return menu;
    }
}

Если вы прокрутите вниз до employeeSubMenu, вы увидите закомментированный мной case 3, который я хочу использовать для запуска метода newEmployee, который находится внутри класса Store. Проблема в том, что я делаю что-то не так. Это не позволит мне сделать это, и я не могу назвать это ни по Store.newEmployee, ни по его прямому имени. Вопрос в том, почему.

Я хотел бы получить некоторую помощь.

Пожалуйста, предположите, что я очень новичок в Java в ваших ответах, если это возможно, поскольку я честно только учусь.

1 Ответ

0 голосов
/ 29 апреля 2020

Обновите свой класс Store для использования static методов и вызова из случаев в коммутаторе, используя Store.newEmployee(....)

class Store {

        private static ArrayList<Employee> employees = new ArrayList<>();
        private static ArrayList<Product> products = new ArrayList<>();

        private static final String EMPLOYEES_FILE_PATH = "employees.csv";
        private  static final String PRODUCTS_FILE_PATH = "items.csv";
        private  static final String EMPLOYEES_LIST = "employees";
        private  static final String PRODUCT_LIST = "prodcuts";
        private  static final String ERR_PREFIX = "*********\nERROR\n*********\n";

       public static Employee newEmployee(Integer id ,String firstName, String lastName) throws Exception { //Create a new employee
            for ( Employee e : employees ) {
                if (id == e.id) {
                    throw new IllegalArgumentException(ERR_PREFIX + "This employee ID already exist.");
                }
            }
            Employee e = new Employee(id, firstName, lastName);
            this.employees.add(e);
            System.out.println("Employee "+e.createOutput()+" added to the employees list");
            return e;
        }

        public static void deleteEmployee(Integer id) throws Exception { //Remove Employee
            for(int i = 0; i<employees.size(); i++) {
                if(employees.get(i).id == id) {
                    System.out.println("Employee "+employees.get(i).createOutput()+" was deleted sucsessfully.");
                    employees.remove(i);
                    return;
                }
            }
            throw new IllegalArgumentException("Sorry, no such employee.");
        }
    }

, или создайте Store объект в меню и отметьте его как статус c и назовите его

private static Store store = new Store();

....
case 1: store.newEmployee(....);
....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...