Java 装饰继承受保护的可观察对象的类
假设我想装饰一个继承了受保护的可观察字段的类。我怎样才能访问受保护的变量,从而扩展所述超类的功能 请参见下面更具体的示例 类SuperSuper—最初包含匿名观察者的类Java 装饰继承受保护的可观察对象的类,java,design-patterns,inheritance,anti-patterns,javafx-8,Java,Design Patterns,Inheritance,Anti Patterns,Javafx 8,假设我想装饰一个继承了受保护的可观察字段的类。我怎样才能访问受保护的变量,从而扩展所述超类的功能 请参见下面更具体的示例 类SuperSuper—最初包含匿名观察者的类 package javafxapplication1; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.control.Bu
package javafxapplication1;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.stage.Stage;
public class SuperSuper extends Application {
protected Button button = new Button();
@Override
public void start(Stage stage) throws Exception {
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
doSomething();
}
});
}
public String doSomething() {
return "1";
}
}
package javafxapplication2;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.stage.Stage;
import javafxapplication1.SuperSuper;
public class Super extends SuperSuper {
@Override
public void start(Stage stage) throws Exception {
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
doSomething();
}
});
}
@Override
public String doSomething() {
return "2";
}
}
为了达到您的要求,您不需要Super
装饰extends
即可:
class SuperDecorator extends Super {
@Override
public void doSomething() {
System.out.println("3");
}
}
然后调用newsuperdecorator().doSomething()
理想情况下,decorator实现应该通过接口
,您修改的方法是正确的,尽管扩展
仍然不能很好地工作,因为方法被委托给zuper
并修改了结果(修饰
)。考虑以下交替:
public class SuperSuper extends Application implements IActionPerformer {
@Override
public void start(Stage stage) throws Exception {
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
doSomething();
}
});
}
public String doSomething() {
return "1";
}
}
public class Super extends SuperSuper {
public String doSomething() {
return "2";
}
}
abstract class AbstractSuperDecorator implements IActionPerformer {
protected IActionPerformer zuper;
public AbstractSuperDecorator(IActionPerformer zuper) {
this.zuper = zuper;
}
public String doSomething() {
return zuper.doSomething();
}
}
public class Super3Decorator extends AbstractSuperDecorator {
public Super3Decorator(IActionPerformer zuper) {
super(zuper);
}
public String doSomething() {
return super.doSomething()+"some-val"; //decoration
}
}
公共类SuperSuper扩展应用程序实现IActionPerformer{
@凌驾
public void start(Stage)引发异常{
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent t){
doSomething();
}
});
}
公共字符串doSomething(){
返回“1”;
}
}
公共类超级扩展超级超级{
公共字符串doSomething(){
返回“2”;
}
}
抽象类AbstractSuperDecorator实现IActionPerformer{
受保护的Iacon-zuper;
公共抽象超级装饰器(IACTIONPER){
this.zuper=zuper;
}
公共字符串doSomething(){
返回zuper.doSomething();
}
}
公共类Super3Decorator扩展了AbstractSuperDecorator{
公共Super3Decorator(IACTIONPER){
超级(zuper);
}
公共字符串doSomething(){
return super.doSomething()+“some val”;//装饰
}
}
注意:了解这一区别,即您的装饰是围绕着
doSomething
移动到界面
,而不是围绕着开始
或按钮
start
对doSomething
的依赖是隐含的(实现驱动的),它不是装饰参与者。Hi harsh,感谢您指出此要求。我编辑了这个问题,这样代码就适合装饰师了。现在,当我使用“扩展”时,我可以访问“按钮”,但当我装饰Super时,我不能再访问“按钮”。这是我仍然不应该使用装饰的情况吗?谢谢编辑你的答案。但我有点不知所措,因为在你们的例子中,我无法观察到按钮。在这种情况下,我将无法再显示屏幕,因为我无法扩展应用程序。
class SuperDecorator extends Super {
@Override
public void doSomething() {
System.out.println("3");
}
}
public class SuperSuper extends Application implements IActionPerformer {
@Override
public void start(Stage stage) throws Exception {
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
doSomething();
}
});
}
public String doSomething() {
return "1";
}
}
public class Super extends SuperSuper {
public String doSomething() {
return "2";
}
}
abstract class AbstractSuperDecorator implements IActionPerformer {
protected IActionPerformer zuper;
public AbstractSuperDecorator(IActionPerformer zuper) {
this.zuper = zuper;
}
public String doSomething() {
return zuper.doSomething();
}
}
public class Super3Decorator extends AbstractSuperDecorator {
public Super3Decorator(IActionPerformer zuper) {
super(zuper);
}
public String doSomething() {
return super.doSomething()+"some-val"; //decoration
}
}