受保护的字段与受保护的方法与为操作处理程序实现接口

时间:2010-07-20 08:11:31

标签: java oop inheritance interface wicket

我有一个代表Wicket中“返回”,“前进”和“canel”按钮的基本页面的课程。但并非所有页面都有所有按钮,例如: G。第一页显然没有“回去”。

我的想法是定义一个通用的ActionHandler

public interface ActionHandler {
  void perform();
}

让子类返回它们支持的操作:

public Derived extends BasicPage {
  protected ActionHandler getForwardHandler() {
    return new ActionHandler() {
      void perform() {
        doIt();
      }
    };
  }
}

问题是:为什么不使用受保护的字段?

public Derived extends BasicPage {
  protected forwardHandler = new ActionHandler() {
      void perform() {
        doIt();
      }
    };
}

另一种选择是不使用继承(这里没有真正意义)并从外部设置ActionHandler:

Toolbar toolbar = new Toolbar();
toolbar.setForwardHandler(new ActionHandler() {
  void perform() {
    doIt();
  }
});

我没有使用像ForwardHandler和CancelHandler这样的接口的原因是,我想将处理程序传递给工具栏,将ActionHandlers作为参数。或者您是否将整个页面传递到工具栏并让工具栏根据实现的界面决定显示哪些按钮?对我来说听起来很糟糕。

这个想法是不是每个页面都必须定义一个新工具栏,但也许它会更简单......

1 个答案:

答案 0 :(得分:2)

为什么不使用受保护的字段?它会起作用;子类只是将字段重新分配给他们想要的ActionHandler

但是我认为这比受保护的方法更糟糕。您正在尝试定义行为,并且行为由方法定义。使用字段,您可以将其初始值分配给null或一些虚拟处理程序,这会使对象处于奇怪的状态,其中应该由对象本身定义的行为可能会意外地保持未定义。

由于受保护的方法确实不是更复杂或更多的代码,我认为这是合适的。它可以有一个默认的实现,什么都不做。

我不知道具体的子类是否有理由让调用者定义他们的行为。如果FooPage真的代表页面Foo,而Foo有固定的行为,那么FooPage应该定义它。

我不知道是否存在不良副作用,但是,将页面实体之类的内容传递给对象以让它决定其行为原则上听起来并不可怕。