我正在尝试创建一个View类,它根据它的创建方式提供Horizontal或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对象时,我传入Horizontal或Vertical字段管理器,然后委托对它进行调用。这有点类似于Screen类在黑莓中的作用。
实际上我正在查看Screen的黑莓文档,看看它代表什么叫(所以我可以效仿),我在屏幕上注意到这样的调用......
protected boolean keyChar(char c,int status,int time)
将焦点生成事件委托给具有焦点的受控字段。 此方法在此屏幕的委托管理器上调用Manager.keyChar(char,int,int)。
那么它立即告诉我,世界上他们如何在屏幕代表上调用受保护的方法?或者说文档错了,这个方法没有委托?
任何人都知道他们是如何做到这一点的?
答案 0 :(得分:0)
提醒自己what protected means:
可以通过调用受保护的方法 其类中的任何子类,但不是 不相关的课程。
这不能直接回答您的问题,但是您可以延长Screen
(API 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();
}
}