передать абстрактный класс вместо объекта в Java? - PullRequest
0 голосов
/ 10 мая 2011

У меня возникли проблемы с моей моделью MVC в Java.

Я передаю объектный выигрыш методу addModal, чтобы я мог взять любое окно или в основном любое действие в моем контекстном меню и обработать его в своем методе handelAction. Тем не менее, я знаю, что это не лучший способ передавать объекты с тех пор, как мы работаем со всей Java, поэтому мой вопрос:

Могу ли я создать какой-нибудь абстрактный класс-обертку, который может быть использован вместо Object?

Обратите внимание, что все мои представления расширяют AbstractView, и поэтому я не могу просто расширить эти представления, и второе, на что следует обратить внимание, это то, что я не могу просто передать AbstractView, поскольку он не всегда будет представлением, которое я хочу показать когда действие происходит.

Не вдаваясь в подробности, вот тестовый код, который у меня есть на данный момент:

public void addModal(Action action, Object win, ACTION_CONTEXT_MENU menuSelection){

    switch(menuSelection){
    case SINGLE: 
        singleActions.put(action, win);
        print("singleActions added");
        break;
    case MULTI:
        multiActions.put(action, win);
        print("multiActions added");
        break;
    default: 
        singleActions.put(action, win);
        multiActions.put(action, win);
        print("defaultActions added");
        break;
    }
}

public void handleAction(Action action, Object sender, Object target) {
    if(view.getSelectedRows().size() > 1){
        if(multiActions.get(action) instanceof ModalWindowView){
            print("multi we have an instance of modalwindowview");
            ((ModalWindowView) multiActions.get(action)).showWindow();
        }else{
            view.getTable().setEditable(true);
        }
    }else{
        if(singleActions.get(action) instanceof ModalWindowView){
            print("single we have an instance of modalwindowview");
            ((ModalWindowView) singleActions.get(action)).showWindow();
        }else{
            view.getTable().setEditable(true);
        }
    }


}

public class TestEditTableCrap extends VerticalLayout{

    public TestEditTableCrap(Container container){
        EditTableModel model = new EditTableModel();
        EditTableController controller = new EditTableController();
        EditTableView editTableView = (EditTableView)controller.requestView(model);//this returns an EditTableView
        editTableView.registerEventListener(controller);
        //editTableView.addActionHandler(controller);
        //editTableView.addShortcutListener(controller.getExtendedShortcutListener("enter", KeyCode.ENTER));

        editTableView.setContainerDataSource(container);

        RegistryIdEditTable registryIdTable;

        ContactView view = null;
        addComponent(editTableView.getTable());

        ModalWindowModel winModelNew = new ModalWindowModel(MODAL_SETTINGS.NEW_MODAL_WINDOW);
        ModalWindowModel winModelEdit = new ModalWindowModel(MODAL_SETTINGS.EDIT_MODAL_WINDOW);
        ModalWindowModel winModelDelete = new ModalWindowModel(MODAL_SETTINGS.DELETE_MODAL_WINDOW);

        ModalWindowController winController = new ModalWindowController();
        ModalWindowController winController2 = new ModalWindowController();
        ModalWindowController winController3 = new ModalWindowController();

        ModalWindowView winViewNew = (ModalWindowView)winController.requestView(winModelNew);
        ModalWindowView winViewEdit = (ModalWindowView)winController2.requestView(winModelEdit);
        ModalWindowView winViewDelete = (ModalWindowView)winController3.requestView(winModelDelete);

        controller.addModal(new Action("New"), winViewNew, ACTION_CONTEXT_MENU.ALL);
        controller.addModal(new Action("Modify all selections"), winViewEdit, ACTION_CONTEXT_MENU.MULTI);
        controller.addModal(new Action("Delete"), winViewDelete, ACTION_CONTEXT_MENU.ALL);

    }
}

Последующие вопросы: есть ли образец для такого рода вещей? Обтекание классов, которые уже расширяют другие абстрактные классы в новом абстрактном классе?

Ответы [ 3 ]

3 голосов
/ 10 мая 2011

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

1 голос
/ 10 мая 2011

Если вы хотите избежать широкого использования instanceof, вы можете реализовать шаблон посетителя .

Ваш handleAction может быть помещен в класс посетителя, используя двойную диспетчеризацию, чтобы определить, какой тип окна долженбыть посещенным, позволяет вам использовать перегрузку метода в классе посетителя вместо instanceof.

1 голос
/ 10 мая 2011

Это то, что interface для

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