Я пытался найти решение для моих сомнений на форуме, но я не смог.
Сверху у меня есть абстрактный класс Item. На первом уровне наследования у меня есть ClickableItem и DraggableItem, и многие из них расширяют эти два класса. Затем у меня есть класс View, который содержит много элементов (в ArrayList), и этот класс имеет 2 метода: onClick и onDrag.
Что я сейчас делаю, так это проверяю метод onClick на все элементы и, если элемент расширяет ClickableItem, а затем вызывает метод onClick элемента. То же самое для onDrag
метода.
Но я чувствую, что это не очень хорошо oop. Объект item должен знать, должен ли он вызывать этот метод или нет, а не класс View, верно? Класс View должен вызывать метод, который должен иметь все элементы, и элементы должны решать, вызывать ли onDrag или нет.
Сейчас у меня есть что-то вроде этого:
public abstract class Item{
int x, y;
public Item(int x, int y){
this.x = x;
this.y = y;
}
}
abstract class ClickableItem extends Item{
protected boolean amIclicked(int x, int y);
public ClickableItem(int mouseX, int mouseY){
super(x, y);
}
}
abstract class DraggableItem extends Item{
protected boolean amIdragged(int x, int y);
public ClickableItem(int mouseX, int mouseY){
super(x, y);
}
}
class ClickableImage extends ClickableItem{
String imgRoute;
public ClickableImage(int x, int y, String imgRoute){
super(x, y);
this.imgRoute = imgRoute;
}
public boolean amIclicked(int mouseX, int mouseY){
}
}
class DraggableImage extends DraggableItem{
String imgRoute;
public DraggableImage(int x, int y, String imgRoute){
super(x, y);
this.imgRoute = imgRoute;
}
public boolean amIdragged(int mouseX, int mouseY){
}
}
class View{
ArrayList<Item> items;
DraggableItem draggedItem;
public View(){
items = new ArrayList<Item>();
items.add(new ClickableImage(200, 200, "dog.jpg"));
items.add(new DraggableImage(500, 500, "cat.jpg"));
}
void onClick(int mouseX, int mouseY){
for(Item it : items){
if(ClickableItem.class.isAssignableFrom(it.getClass())){
((ClickableItem)it).amIclicked(mouseX, mouseY);
}
}
}
void onDrag(int mouseX, int mouseY){
for(Item it : items){
if(DraggableItem.class.isAssignableFrom(it.getClass())){
if(((DraggableItem)it).amIdragged(mouseX, mouseY)){
draggedItem = (DraggableItem)it;
}
}
}
}
}