Java 如何使用对象强制转换引用';什么是原班人马?
我正在处理一个GUI库,我有一个类Java 如何使用对象强制转换引用';什么是原班人马?,java,casting,processing,Java,Casting,Processing,我正在处理一个GUI库,我有一个类组件。我还有一些扩展组件的类:标签,按钮(扩展标签),面板和图标。这些类只包含“逻辑”部分(位置、文本、函数检查,如果单击了它们等等) 类面板内部有组件的阵列列表,您可以向其中添加按钮、标签等 为了显示组件,我决定使用一个类主题,它在函数display(Component Component)中有一些重载(一个用于标签,一个用于按钮,一个用于面板等) 在display(Panel-Panel)内部,在某个点上,我显示了面板的所有子项,但它不将它们(子项)视为按钮
组件
。我还有一些扩展组件的类:标签
,按钮
(扩展标签
),面板
和图标
。这些类只包含“逻辑”部分(位置、文本、函数检查,如果单击了它们等等)
类面板
内部有组件
的阵列列表
,您可以向其中添加按钮、标签等
为了显示组件,我决定使用一个类主题
,它在函数display(Component Component)
中有一些重载(一个用于标签
,一个用于按钮
,一个用于面板
等)
在display(Panel-Panel)
内部,在某个点上,我显示了面板的所有子项,但它不将它们(子项)视为按钮
或标签
,而是将它们视为组件
。我如何解决这个问题
1) 我已经尝试在类组件,按钮等中使用方法display()
。。。它可以部分工作,但会带来一些“编码问题”:要覆盖函数显示,必须创建一个新类(例如:GreenBackgroundButton extends Button{})。另外,通过将所有函数放在一个外部类中,您可以用一个类控制程序的所有RAPIHC,这样您就可以用一个函数为所有组件提供相同的背景displayback()
等
2) instanceof
无法使用,因为如果我必须使用它来强制转换面板的子级,用户无法创建自定义组件,因为它们将显示为Component
而不是TextField
(示例)
3) 我曾尝试直接强制转换显示((按钮)panel.getChildren.get(0))
,但是,正如它所显示的,当我使用标签时,它给出了一个错误(如预期的那样)
4) 我也尝试过这样的强制转换:panel.getChildren().get(0.getClass().cast(panel.getChildren().get(0))
,但它不起作用,我不知道为什么。(我尝试了它的所有变体,如创建外部对象等。)
5) 如果你需要更多的代码,你可以问
public void display(Panel panel) {
println("panel");
if (panel.isVisible()) {
pushMatrix();
translate(panel.getX(), panel.getY());
displayBackground(panel, #AAAAAA);
for (int i = 0; i < panel.getChildren().size(); i++) {
this.display(panel.getChildren().get(i).getClass().cast(panel.getChildren().get(i))); //THIS IS THE LINE WITH THE ISSUE
//println(panel.getChildren().get(i).getClass().cast(panel.getChildren().get(i)));
}
popMatrix();
}
}
我希望在画布上看到面板内的工作按钮,而不是看到组件。我现在想不出有什么特别的错误。使用instanceof
几乎总是一种黑客行为,可能是一种糟糕设计的症状
所描述的听起来完全像一个现有的java库(AWT),所以你可以考虑“借用”它们的一些设计模式。
Component
是一个抽象类,它定义了一个抽象的paint()
函数。paint()
函数接受一个Graphics
参数。马上就有更多
按钮
和标签
扩展组件
并覆盖paint()
功能
Graphics
是一个包含函数的类,如drawRect()
和setBackground()
。它封装了共享的绘图代码,类似于我认为您的主题
类所做的
如果我是你,我会考虑为你的图书馆采取类似的方法。
我将尝试回答您的一些其他评论:
示例:GreenBackgroundButton扩展按钮{}
喜欢这种情况。您不需要扩展按钮来设置背景。相反,在按钮()
类(或在组件
类)中使用setBackground()
函数
另外,通过将所有函数放在一个外部类中,您可以用一个类控制程序的所有RAPIHC,这样您就可以用一个函数displayBackground()等为所有组件提供相同的背景
听起来这应该属于您的组件类
另外,退一步,我鼓励您避免寻求解决方案的诱惑。您可能认为您需要一个具有多个继承级别和许多不同类的复杂设计,但更简单的设计可能会为您提供所需的几乎所有东西。具体地说,我不认为将任何代码提取到主题
类中有什么好处。我可能会将所有内容直接放在我的组件子类中,比如按钮
和标签
实际上,我使用过Java Swing(也有Java AWT),我遇到的主要问题是,我必须为每个组件扩展UI类,以创建自定义UI(这导致了大量自定义UI类,其中一些是重复的),这就是我想“外部化”的原因图形部分。考虑一下,您的答案是正确的,但部分是:组件将扩展抽象类可显示的,还有一个UI
实例。感谢您的回答,它帮助我决定了如何继续。
Theme basicTheme;
Button close;
Panel panel;
void settings() {
size(400, 600, P2D);
}
void setup() {
basicTheme = new Theme();
close = new Button();
close.setBounds(10, 10, 100, 25);
close.setText("close");
panel = new Panel();
panel.setBounds(50, 200, 200, 200);
panel.add(close);
}
void draw() {
background(255);
basicTheme.display(panel);
}