【问题标题】:BlackBerry - Fun with FieldManagersBlackBerry - FieldManagers 的乐趣
【发布时间】:2010-12-24 03:34:18
【问题描述】:

我正在尝试创建一个 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

}

当我实例化一个视图对象时,我传入一个水平或垂直字段管理器,然后将调用委托给它。这有点像黑莓中的 Screen 类。

实际上,我正在查看 Screen 的黑莓文档以查看它所代表的调用(因此我可以模拟它),并且我注意到 Screen 中的调用是这样的......

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

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

然后我立刻明白了,他们到底是如何在屏幕的委托上调用受保护的方法的?还是文档有误,并且没有委托此方法?

有人知道他们是如何做到这一点的吗?

【问题讨论】:

    标签: user-interface blackberry layout


    【解决方案1】:

    提醒自己what protected means

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

    这并不能直接回答您的问题,但是您可以扩展 Screen (API here) 而不是 Manager 然后在构造函数中调用 super(mDelegate) 吗?那么大概任何必要的魔法都会起作用?

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

    【讨论】:

      【解决方案2】:

      在其他一些 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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-02-08
        • 2013-11-26
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        • 2015-04-13
        • 1970-01-01
        • 2016-11-05
        • 1970-01-01
        相关资源
        最近更新 更多