Groovy техника для пересылки всех методов в инкапсулированный объект? - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть TreeTableView подкласс. Я хочу использовать SelectionModel для этого, в котором определенные методы генерируют исключения, если предпринята попытка их использования (см. этот вопрос по причине).

Скорее, к сожалению, класс TreeTableView.TreeTableViewSelectionModel - это abstract. Мой «старт» при попытке доставить такой конкретный класс заключается в следующем:

class MyTreeTableSelectionModel extends TreeTableView.TreeTableViewSelectionModel {
    final static String PROHIBITED_METHOD_MSG = 'Method is prohibited due to problems with internal JavaFX NPEs. Use select( row, column ) instead.'
    TreeTableView.TreeTableViewSelectionModel suppliedConcreteModel

    MyTreeTableSelectionModel(TreeTableView treeTableView) {
        super( treeTableView )
        assert treeTableView.selectionModel != null
        suppliedConcreteModel = treeTableView.selectionModel
    }

    @Override
    ObservableList<TreeTablePosition> getSelectedCells() {
        suppliedConcreteModel.getSelectedCells()
    }

    @Override
    boolean isSelected(int row, TableColumnBase column) {
        suppliedConcreteModel.isSelected( row, column )
    }

    @Override
    void select(int row, TableColumnBase column) {
        suppliedConcreteModel.select( row, column )
    }

    @Override
    void clearAndSelect(int row, TableColumnBase column) {
        suppliedConcreteModel.clearAndSelect( row, column )
    }

    @Override
    void clearSelection(int row, TableColumnBase column) {
        suppliedConcreteModel.clearSelection( row, column )
    }

    @Override
    void selectLeftCell() {
        suppliedConcreteModel.selectLeftCell()
    }

    @Override
    void selectRightCell() {
        suppliedConcreteModel.selectRightCell()
    }

    @Override
    void selectAboveCell() {
        suppliedConcreteModel.selectAboveCell()
    }

    @Override
    void selectBelowCell() {
        suppliedConcreteModel.selectBelowCell()
    }

    @Override
    void select( int row ){
        throw new Exception( PROHIBITED_METHOD_MSG )
    }

    @Override
    void selectFirst(){
        throw new Exception( PROHIBITED_METHOD_MSG )
    }

    @Override
    void selectLast(){
        throw new Exception( PROHIBITED_METHOD_MSG )
    }
}

... это (очевидно) не работает так, как реализовано: реализованные переопределенные abstract методы пересылают вызовы инкапсулированному объект suppliedConcreteModel, но другие методы (которых может быть около 50) и все свойства и поля перенаправляются на конкретный объект класса MyTreeTableSelectionModel.

Есть ли Groovy способ пересылки всех методов, полей и свойств для инкапсулированного объекта? Я посмотрел на этот вопрос , но я не до конца его понимаю или действительно ли он актуален, и я подозреваю, что существует более "ортодоксальный" Groovy способ делать то, что я хочу.

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