Java 受保护字段vs.受保护方法vs.实现操作处理程序接口
我有一个类,它表示一个基本页面,Wicket中有“返回”、“前进”和“canel”按钮。但并非所有页面都有所有按钮,例如。G第一页显然没有“返回” 我的想法是定义一个通用的ActionHandlerJava 受保护字段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()
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
应该定义它
我不知道是否有不好的副作用,但是,将页面实体之类的东西传递给一个对象,让它决定其行为在原则上听起来并不可怕。如果我要使用“不做任何事情的默认实现”,我必须通过反射查看覆盖了哪些方法,以便只显示具有实际操作的按钮。