黑莓 - 与FieldManagers一起玩

时间:2009-12-07 19:12:09

标签: user-interface blackberry layout

我正在尝试创建一个View类,它根据它的创建方式提供Horizo​​ntal或Vertical布局。我正在使用代表来实现这一目标。

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对象时,我传入Horizo​​ntal或Vertical字段管理器,然后委托对它进行调用。这有点类似于Screen类在黑莓中的作用。

实际上我正在查看Screen的黑莓文档,看看它代表什么叫(所以我可以效仿),我在屏幕上注意到这样的调用......

  

protected boolean keyChar(char c,int status,int time)

     

将焦点生成事件委托给具有焦点的受控字段。   此方法在此屏幕的委托管理器上调用Manager.keyChar(char,int,int)。

那么它立即告诉我,世界上他们如何在屏幕代表上调用受保护的方法?或者说文档错了,这个方法没有委托?

任何人都知道他们是如何做到这一点的?

2 个答案:

答案 0 :(得分:0)

提醒自己what protected means

  

可以通过调用受保护的方法   其类中的任何子类,但不是   不相关的课程。

这不能直接回答您的问题,但是您可以延长ScreenAPI here)而不是Manager,然后在构造函数中调用super(mDelegate)吗?那么无论什么魔法都必要起作用呢?

除此之外,我建议您尝试一下,看看是否可以覆盖所谓的受保护方法!

答案 1 :(得分:0)

我设法在其他一些SO问题的帮助下找到解决这个问题的方法。

我的解决方案是创建一个接口,为受保护的方法提供公共访问点,然后将Manager类子类化并混合在该接口中。然后,public方法将调用其super的受保护方法。

然后,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();
    }
}