0

保護された監視可能なフィールドを継承するクラスを装飾したいとしましょう。上記のスーパークラスの機能を拡張できるように、その保護された変数にアクセスするにはどうすればよいですか?

以下のより具体的な例を参照してください。

クラス 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";
    }
}

Class Super - 匿名オブザーバーを継承するスーパークラス

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

クラス SuperDecorator - スーパーのデコレータ クラス

package javafxapplication3;

import javafxapplication2.Super;


class SuperDecorator extends Super {
    Super zuper;

    public SuperDecorator(Super zuper){
        this.zuper = zuper;
    }

    @Override
    public String doSomething() {
        return zuper.doSomething()+"3";
    }

    //What should I put here in order to make zuper's button print 3?
}
4

1 に答える 1

2
//What should I put here in order to make zuper's button print 3?

要件を達成するために、Super装飾は必要ありませんextends。正常に機能する必要があります。

class SuperDecorator extends Super {
    @Override
    public void doSomething() {
        System.out.println("3");
    }
}

そして電話するnew SuperDecorator().doSomething()

理想的には、デコレータの実装は を経由する必要がinterfaceあります。変更されたアプローチは正しいですが、メソッドが委譲され、結果が変更さextendsれるため、装飾中に継承を使用する方法としてはまだうまく機能しません( )。次の代替案を検討してください。zuperdecorated

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

注:装飾がやの周りではなく にdoSomething移動するという違いを理解してください。への依存は暗黙的 (実装主導) であり、装飾の参加者ではありません。interfacestartbuttonstartdoSomething

于 2013-10-22T08:01:52.277 に答える