Правильный шаблон реализации в java: несколько классов наследуются от абстрактного класса, но один метод отличается - PullRequest
0 голосов
/ 30 марта 2020

Я пытался найти решение для моих сомнений на форуме, но я не смог.

Сверху у меня есть абстрактный класс 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;
                 }
             }
         }
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...