【问题标题】:protected field vs. protected method vs. implementing interface for action handlers受保护字段与受保护方法与操作处理程序的实现接口
【发布时间】:2010-07-20 08:11:31
【问题描述】:

我有一个类,它代表 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 作为参数。还是将整个页面传递给工具栏,让工具栏根据实现的接口决定显示哪些按钮?对我来说,这听起来像是糟糕的 OOP。

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

【问题讨论】:

    标签: java oop inheritance interface wicket


    【解决方案1】:

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

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

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

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

    我不知道是否有不好的副作用,但是,将页面实体之类的东西传递给一个对象,让其决定其行为原则上听起来并不可怕。

    【讨论】:

    • 如果我要使用“什么都不做的默认实现”,我必须通过反射查看哪些方法被覆盖,以仅显示具有实际操作的按钮。
    猜你喜欢
    • 2020-03-31
    • 2012-10-13
    • 2010-11-17
    • 2016-07-19
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多