Как создать экземпляр объекта из массива, который содержит несколько типов объектов - PullRequest
0 голосов
/ 02 февраля 2020

Я создаю часть программного обеспечения как часть оцениваемого задания. В программе есть родительский класс Пользователь , с тремя дочерними классами Сотрудник , ShopOwner и Клиент .

public class UserList {

ArrayList<User>Users;    

public UserList(){
Users=new ArrayList<>();
}

Когда программа запускается, объекты создаются и добавляются в UserList , ArrayList, который должен содержать User объекты, включая его дочерние классы:

public void loadFromFile() throws FileNotFoundException, IOException{


FileReader reader;
reader = new FileReader(filename);
BufferedReader bin = new BufferedReader(reader);
String record = new String();

while ((record = bin.readLine())!=null)
   {    
            String Name = bin.readLine();
            String Password = bin.readLine();
            String Role = bin.readLine();

            switch (Role){

                case "Customer":
                   Customer customer = new Customer();
                   customer.edit(Name, Password, Role);
                   add(customer);
                   break;

                case "Employee":
                   Employee employee = new Employee();
                   employee.edit(Name, Password, Role);
                   add(employee);                    
                   break;  

                case "ShopOwner":
                   ShopOwner shopOwner = new ShopOwner();
                   shopOwner.edit(Name, Password, Role);
                   add(shopOwner);                      
                   break;             
           }  
   }

bin.close();
bin =null;

} 

метод добавления выглядит следующим образом:

public void add(User src) throws IOException{

Users.add (src);

} ​​

В этот момент я ожидаю, что Users , ArrayList типа Пользователь может содержать экземпляры всех трех дочерних классов.

В моем основном методе мне нужно инициализировать объект для доступа к методам дочернего класса Customer , здесь все становится сложнее, у меня есть следующий объект customer:

aCustomer = new Customer();

Затем я пытаюсь присвоить ему значения, используя метод из класса UserList:

aCustomer = theUserList.logIn(name,password,role);

метод входа в систему выглядит следующим образом:

public User logIn(String strname, String strpassword, String strrole){   
    User currentUser = null;
    for( User aUser:this.Users)

    if(strname.equalsIgnoreCase(aUser.getName())&&
       strpassword.equalsIgnoreCase(aUser.getPassword())&&
       strrole.equalsIgnoreCase(aUser.getRole())){       

       currentUser=aUser;
    }    
return currentUser;       

}

Я понимаю, что он возвращает Пользователь объект, тогда как запрос заключается в создании экземпляра объекта Клиент , однако я запутался, что метод logIn сканирует через Пользователи , который должен содержать все три типа объектов, согласно методу loadFromFile ().

Ошибка следующая:

enter image description here

Мне нужен доступ к объекту customer в основном методе. Не уверен, что часть пути не так, поэтому все было скопировано, поэтому извиняюсь за длинный вопрос. Любая помощь, указывающая на изменение, необходимое для доступа к объекту customer из ArrayList, содержащего несколько типов объектов, очень ценится.

Я новичок в Java, поэтому извиняюсь, если это вопрос новичка, пожалуйста, сообщите мне, как изменить вопрос, если это необходимо, вместо того, чтобы закрывать его, так как этот проект действительно важен, и мне действительно нужна помощь .

РЕДАКТИРОВАТЬ *

Для решения этой проблемы использовался downcasting, и ошибка несовместимого типа исчезла, но объект все еще не обращается к методу заказчика getBasket ().

User aCustomer = new Customer();
                aCustomer = theUserList.logIn(name,password,role);
                aCustomer.getBasket();

Ответы [ 3 ]

0 голосов
/ 02 февраля 2020

Если ваш метод getBasket является клиентским эксклюзивным методом, но вы объявили экземпляр как пользователь, возможно, вам придется понизить рейтинг перед вызовом вашего метода. Я не уверен, что это самый эффективный способ сделать это. Вы также можете определить пустой метод getBasket в своем пользовательском классе, и он должен работать.

User aCustomer = new Customer();
                aCustomer = theUserList.logIn(name,password,role);
                (Customer) aCustomer.getBasket();
0 голосов
/ 03 февраля 2020

Это было решено путем уныния. в следующей строке кода aCustomer изначально является объектом типа User, затем он понижается до типа Customer.

aCustomer = theUserList.logIn(name,password,role);   

 Customer castedCustomer = (Customer)aCustomer;
try {
    castedCustomer.getTheBasket().add(aProduct);



} catch (IOException ex) {
    Logger.getLogger(ShopJFrame.class.getName()).log(Level.SEVERE, null, ex);
}               

Спасибо за помощь в этом.

0 голосов
/ 02 февраля 2020

Приведите ваш возвращаемый объект из функции входа в тип пользователя

switch (role)
        {
            case "Customer":
                Customer acustomer = (Customer) userList.logIn("A","B","C");
                //System.out.println(acustomer.Name);


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