Метод, который принимает суперкласс в качестве параметра и манипулирует подклассами - PullRequest
0 голосов
/ 01 марта 2020

У меня есть класс "A", который имеет два массива списков объектов двух классов "B C" и "BD". B C и BD наследуются от абстрактного класса "B".

Так что я изо всех сил пытаюсь сделать, я хочу сделать один add (); метод, который принимает объекты B в качестве параметра и добавляет объекты B C, если параметр имеет тип B C, и добавляет объекты BD, если параметр имеет тип BD. Есть ли правильный способ сделать это, или я должен сделать отдельные методы добавления?

   public class A
   {
        private ArrayList<BC> bcArrayList= new ArrayList<>();
        private ArrayList<BD> bcArrayList= new ArrayList<>();

        public void add(ArrayList<B> bArrayList)
        {
            //m = create new object of type, either BC or BD;
            bArrayList.add(m);
        }
   }

Ответы [ 4 ]

1 голос
/ 01 марта 2020

Я думаю, что если вы хотите добавить несколько объектов из списка, есть один метод, который принимает List<B> и использует instanceof

public void add(List<B> bList) {
    for (B b : bList) {
        if (b instanceof BC) {
            bcArrayList.add((BC)b);
        }
        if (b instanceof BD) {
            bdArrayList.add((BD)b);
        }
    }         
}

Но для добавления отдельных объектов я думаю, используя перегрузку метода это самый чистый способ сделать это

public void add(BC b) {
    bcArrayList.add(b);
}

public void add(BD b) {
    bdArrayList.add(b);
}

Конечно, вы можете добавить их всех в свой класс и использовать их вот так

A a = new A();
a.add(new BC());
a.add(new BD());
List<B> list = new ArrayList<>();
list.add(new BC());
list.add(new BD());
a.add(list);
0 голосов
/ 01 марта 2020

Если вам действительно нужно это сделать, я думаю, вы могли бы сделать что-то вроде этого:

public class A {
     private List<B> bcArrayList = new ArrayList<>();
     private List<B> bdArrayList = new ArrayList<>();

     public void add(List<B> bArrayList) {
         for (B item : bArrayList){

             if (item.getClass() == BC.class) {
                 bcArrayList.add(item);

             } else if (item.getClass() == BD.class){
                 bdArrayList.add(item);
             }
         }
     }
}

Тем не менее, вы уверены, что вам это действительно нужно?

Почему бы не поставить они в одном и том же списке (все они являются объектами типа B) и имеют подклассы BC и BD, ведущие себя по-разному при необходимости. Вот что такое полиморфизм.

0 голосов
/ 01 марта 2020

Я думаю, что самый безопасный способ сделать это - использовать оператор instanceof.

   public class A
   {
        private ArrayList<BC> bcArrayList= new ArrayList<>();
        private ArrayList<BD> bdArrayList= new ArrayList<>();

        public void add(ArrayList<B> bArrayList) {
            for(B element : bArrayList) {
             if(element instanceof BC) {
                 bcArrayList.add((BC) element);
             } else if (element instanceof BD) {
                 bdArrayList.add((BD) element);
             } else {
                 continue;
             }
             }
        }
   }

0 голосов
/ 01 марта 2020

Попробуйте использовать метод getClass iemgetClass ().

...