gpt4 book ai didi

java - protected 字段与 protected 方法与操作处理程序的实现接口(interface)

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:40:48 27 4
gpt4 key购买 nike

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

我的想法是定义一个通用的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 这样的接口(interface)的原因是,我想将处理程序传递给工具栏,它将 ActionHandlers 作为参数。还是将整个页面传递给工具栏,让工具栏根据实现的界面决定显示哪些按钮?对我来说听起来像是糟糕的 OOP。

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

最佳答案

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

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

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

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

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

关于java - protected 字段与 protected 方法与操作处理程序的实现接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3288072/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com