BlackBerry - веселье с полевыми менеджерами - PullRequest
2 голосов
/ 07 декабря 2009

Я пытаюсь создать класс View, который обеспечивает горизонтальную или вертикальную компоновку в зависимости от того, как он создается. Я использую делегата для достижения этой цели.

class View extends Manager {
    private Manager mDelegate;

    public View(Manager inDelegate) {
        mDelegate = inDelegate;
        // the delegate is the only child of "this" manager.
        super.add(mDelegate);
    }

    public void add(Field f) {
        // all other children go into the delegate.    
        mDelegate.add(f);
    }

    // other methods that also delegate

}

Когда я создаю экземпляр объекта View, я передаю его в горизонтальный или вертикальный менеджер полей, а затем делегирую ему вызовы. Это то, что класс Screen делает в blackberry.

На самом деле, я просматриваю документы Blackberry для Screen, чтобы увидеть, какие вызовы он делегирует (чтобы я мог эмулировать это), и я замечаю такие вызовы в Screen ...

защищенный логический ключChar (char c, int status, int time)

Делегирует событие генерации ключа в контролируемое поле с фокусом. Этот метод вызывает Manager.keyChar (char, int, int) в диспетчере делегатов этого экрана.

Итак, меня сразу же осенило, как в мире они вызывают защищенный метод для делегата экрана? Или документы не так, и этот метод не делегирован?

Кто-нибудь знает, как они этого добиваются?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2009

Мне удалось найти решение этой проблемы с помощью некоторых других вопросов SO.

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

Затем классу View передается один из этих подклассов Manager.

public interface ManagerDelegate {
    Manager asManager();
    // Provide public access points to any protected methods needed.
    void doProtectedMethod();
}

public HorizontalDelegate extends HorizontalFieldManager implements ManagerDelegate {
    public Manager asManager() {
        return this;
    }
    public void doProtectedMethod() {
        // call the Manager's protected method.
        protectedMethod();
    }
}

public VerticalDelegate extends VerticalFieldManager implements ManagerDelegate {
    public Manager asManager() {
        return this;
    }
    public void doProtectedMethod() {
        // call the Manager's protected method.
        protectedMethod();
    }
}

public class View extends Manager {
    private final ManagerDelegate mDelegate;

    public View(ManagerDelegate inDelegate) {
        mDelegate = inDelegate;
    }

    protected void protectedMethod() {
        // Call into our delegate's public method to access its protected method.
        mDelegate.doProtectedMethod();
    }

    public void publicMethod() {
        // For public delegated methods I can just get the Manager instance from
        // the delegate and call directly.
        mDelegate.asManager().publicMethod();
    }
}
0 голосов
/ 09 декабря 2009

Напоминаю себе что означает защита :

Защищенный метод может быть вызван любой подкласс в своем классе, но не несвязанными классами.

Это не дает прямого ответа на ваш вопрос, но не могли бы вы расширить Screen ( API здесь ) вместо Manager и затем вызвать super(mDelegate) в своем конструкторе? Тогда, по-видимому, какая магия необходима, просто сработает?

Кроме того, я бы просто предложил вам попробовать и посмотреть, сможете ли вы переопределить предположительно защищенный метод!

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