Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 受保护字段vs.受保护方法vs.实现操作处理程序接口_Java_Oop_Inheritance_Interface_Wicket - Fatal编程技术网

Java 受保护字段vs.受保护方法vs.实现操作处理程序接口

Java 受保护字段vs.受保护方法vs.实现操作处理程序接口,java,oop,inheritance,interface,wicket,Java,Oop,Inheritance,Interface,Wicket,我有一个类,它表示一个基本页面,Wicket中有“返回”、“前进”和“canel”按钮。但并非所有页面都有所有按钮,例如。G第一页显然没有“返回” 我的想法是定义一个通用的ActionHandler public interface ActionHandler { void perform(); } 并让子类返回它们支持的操作: public Derived extends BasicPage { protected ActionHandler getForwardHandler()

我有一个类,它表示一个基本页面,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这样的接口的原因是,我想将处理程序传递到工具栏,它将ActionHandler作为参数。还是将整个页面传递给工具栏,让工具栏根据实现的界面决定显示哪些按钮?对我来说,听起来很糟糕


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

为什么不使用一个受保护的字段?它会起作用;子类只需将该字段重新分配给所需的
ActionHandler

然而,我认为这比受保护的方法更糟糕。您正在尝试定义行为,而行为是由方法定义的。对于字段,您可以将其初始值指定给
null
或某个伪处理程序,这会使对象处于一种奇怪的状态,在这种状态下,应该由对象本身定义的行为可能会意外地未定义

由于受保护的方法实际上并不更复杂,也不需要更多的代码,所以我认为它是合适的。它可以有一个不做任何事情的默认实现

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

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

如果我要使用“不做任何事情的默认实现”,我必须通过反射查看覆盖了哪些方法,以便只显示具有实际操作的按钮。