【发布时间】:2021-09-19 16:56:47
【问题描述】:
我正在尝试创建一个作为 JavaFX 场景类扩展的类。但是,我想为该类的用户提供选项,以提供他们自己现有的 Scene 对象,然后该对象将获得作为扩展类一部分的附加代码。
这是我想做的一个基本示例:
public class MyScene extends Scene {
public MyScene(Parent root, double width, double height) {
super(root,width,height);
}
public MyScene(Scene scene) {
super(scene.getRoot(), scene.getWidth(), scene.getHeight());
//This does not work because two Scene objects cannot exist with the same Parent.
}
}
很明显,上面的第二个类构造函数是行不通的。
我也试过这样做:
Scene scene = new Scene(parent);
MyScene myScene = (MyScene) scene;
但我收到一条错误消息,提示我无法将场景投射到 MyScene。
有什么办法可以做我想做的事吗?而我尝试这样做的唯一原因 - 这基本上是为了方便使用 MyScene 类的人,让他们可以选择预先构建他们的场景,然后使用 MyScene 类中的附加功能......它对整个班级来说只是一个“很好的接触”。
那么有没有办法“转换”或以某种方式将现有场景设置为在类中扩展的对象?
我查看了this question,但我无法真正理解如何将建议的解决方案应用于这种情况,特别是由于 javafx.scene.Scene 没有默认构造函数,因此在任何 MyClass 构造函数中调用 super 成为必需。
【问题讨论】:
-
我不认为你想要的东西是可能的,但也许其他人可以看到我看不到的东西。
-
可以使用decorator pattern代替子类化吗?
-
@trashgod 不幸的是,我认为
Scene也不可能。它具有不能在实例之间共享的状态(特别是root),并且查询该状态的方法不能被覆盖。 -
@Michael 请问,你为什么要继承
Scene? -
@Slaw - 你问这个问题很有趣,因为我正在复习课程并亲自查看,我想这只是我在场景中引用各种属性和方法的方式班级。我决定改变这个类,使它不是场景的子类,然后我在类中添加了一个场景对象,并在类构造函数中实例化了一个新的场景对象,然后任何时候场景需要引用,我只引用那个对象它似乎工作正常。我认为这是我目前唯一的选择。