受保护的字段 vs 受保护的方法 vs 实现接口用于操作处理程序

3

我有一个代表Wicket基本页面的类,其中包括“返回”,“前进”和“取消”按钮。但并非所有页面都具有所有按钮,例如第一页显然没有“返回”按钮。

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

public interface ActionHandler {
  void perform();
}

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

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

问题是:为什么不使用protected字段?
public Derived extends BasicPage {
  protected forwardHandler = new ActionHandler() {
      void perform() {
        doIt();
      }
    };
}

另一种选择是不使用继承(在这里并没有真正的意义),而是从外部设置ActionHandlers:
Toolbar toolbar = new Toolbar();
toolbar.setForwardHandler(new ActionHandler() {
  void perform() {
    doIt();
  }
});

我不使用诸如ForwardHandler和CancelHandler之类的接口是因为我想将处理程序传递给工具栏,该工具栏将ActionHandlers作为参数。或者您会将整个页面传递给工具栏,并让工具栏根据已实现的接口决定显示哪些按钮?这听起来对我来说像是糟糕的面向对象编程。
这个想法是并非每个页面都必须定义一个新的工具栏,但也许这样会更简单...
1个回答

2
为什么不使用受保护字段?这会起作用;子类将简单地重新分配到他们需要的“ActionHandler”领域。但是我认为这比受保护方法更糟糕。您试图定义行为,而行为是由方法定义的。使用字段时,您可以将其初始值分配为null或某个虚拟处理程序,这将使对象处于奇怪的状态,其中应该由对象本身内在定义的行为可能被意外留空。因此,由于受保护方法并不更加复杂或更多代码,我认为它是适当的。它可以有一个默认实现,什么也不做。我不知道具体子类是否应该由调用者定义其行为。如果“FooPage”真正表示页面“Foo”,并且Foo具有固定的行为,则“FooPage”应该定义它。我不知道是否存在不良副作用,但是对于让对象决定其行为的传递类似页面实体的东西原则上并不可怕。

如果我使用“什么也不做的默认实现”,那么我必须通过反射查看哪些方法被覆盖,以仅显示具有真实操作的按钮。 - deamon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接