У меня есть четыре класса Book Disk Paper Magazine
все они вытекают из другого класса Items
, и все они имеют String barcode
поле.
В другом классе foo
меня есть ArrayList<Book> books; ArrayList<Disk> disks; ArrayList<Paper> papers; ArrayList<Magazine> magazines;
ArrayList<Book> books; ArrayList<Disk> disks; ArrayList<Paper> papers; ArrayList<Magazine> magazines;
, и я хочу реализовать для каждого из них getByBarcode(String barcode)
, который будет выглядеть в arraylist для элемента с этим штрих-кодом. Если это книга, она должна выглядеть в списке книг и т.д.
Могу ли я избежать четырех разных? Я имею в виду, что вам не нужно делать getBookByBarcode(String barcode)
который должен был бы выглядеть в списке книг, getDiskByBarcode(String barcode)
который должен был бы выглядеть в списке дисков и т.д.
И иметь общий public Object getByBarcode(String barcode,type)
такой как public Object getByBarcode(String barcode,type)
. Как я могу сделать это в ООП?
По существу каждая книга, журнал, диск и бумага - это предмет. Следовательно, у вас должен быть родительский класс с именем Item, а не его множественная форма. Каждый базовый класс должен классифицироваться как исключительная сущность.
Затем вы должны создавать объекты книги, журнала, диска и бумаги. Поскольку все они классифицируются как Item, создайте список массивов типа Item и добавьте эти объекты к тому же.
Таким образом, у вас есть список предметов, в котором есть книги, журналы, диски и документы. Затем вы можете просмотреть этот список для элемента со штрих-кодом и получить тип элемента.
Исходный код:
Item.java
package myLibrary;
public class Item {
protected String barcode;
public String getBarcode() {
return barcode;
}
public void setBarcode(String barcode) {
this.barcode = barcode;
}
public Item(String barcode) {
this.barcode = barcode;
}
}
Book.java/Disk.java/Magazine.java/Paper.java
package myLibrary;
public class Book extends Item {
public Book(String barcode) {
super(barcode);
}
public String getBarcode() {
return barcode;
}
}
Lecturer.java (класс, содержащий основную функцию)
package myCollege;
import java.util.ArrayList;
import myLibrary.Book;
import myLibrary.Disk;
import myLibrary.Item;
import myLibrary.Magazine;
import myLibrary.Paper;
public class Lecturer {
public static void main(String[] args) {
// Declare items
Book x1 = new Book("Item101");
Book x2 = new Book("Item102");
Disk x3 = new Disk("Item201");
Disk x4 = new Disk("Item202");
Magazine x5 = new Magazine("Item301");
Paper x6 = new Paper("Item401");
Paper x7 = new Paper("Item402");
ArrayList<Item> items = new ArrayList<>();
items.add(x1);
items.add(x2);
items.add(x3);
items.add(x4);
items.add(x5);
items.add(x6);
items.add(x7);
String itemType = getItemByBarcode("Item202", items);
System.out.println(itemType);
}
private static String getItemByBarcode(String barcode, ArrayList<Item> items) {
String itemType = "";
for(Item i : items) {
if(i.getBarcode().equalsIgnoreCase(barcode)) {
itemType = i.getClass().getSimpleName();
}
}
return itemType;
}
}
Вывод:
Disk
Надеюсь, это поможет лучше понять концепцию/проблему.
Item
или Lecturer
.
может показаться хакерским, но вы можете сделать так, как предлагают некоторые другие пользователи
public Object getByBarcode(String barcode, Class<T> classy)
{
ArrayList<Items> items = null;
if(classy.class.getSimpleName().equals(Book.class.getSimpleName()))
items = bookArray;
else if(classy.class.getSimpleName().equals(Magazine.class.getSimpleName()))
items = magazineArray;
else
... cnt'd
for(Item i : items)
if( i.getBarCode().equals(barcode) return i;
}
Затем, чтобы назвать этот зверский беспорядок, вы могли бы сделать что-то вроде этого. , ,
Item i = getByBarCode("0932A3", Book.class);
T getByBarCode(List<T extends Items> items, String barCode)
Подпись должна сказать все это.getByBarCode
будет вызываться извнеfoo
, а другой вызывающий ее класс не имеет доступа к спискам элементов.