Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.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 装饰继承受保护的可观察对象的类_Java_Design Patterns_Inheritance_Anti Patterns_Javafx 8 - Fatal编程技术网

Java 装饰继承受保护的可观察对象的类

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

假设我想装饰一个继承了受保护的可观察字段的类。我怎样才能访问受保护的变量,从而扩展所述超类的功能

请参见下面更具体的示例

类SuperSuper—最初包含匿名观察者的类

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
        }
    }