Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.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_Casting_Processing - Fatal编程技术网

Java 如何使用对象强制转换引用';什么是原班人马?

Java 如何使用对象强制转换引用';什么是原班人马?,java,casting,processing,Java,Casting,Processing,我正在处理一个GUI库,我有一个类组件。我还有一些扩展组件的类:标签,按钮(扩展标签),面板和图标。这些类只包含“逻辑”部分(位置、文本、函数检查,如果单击了它们等等) 类面板内部有组件的阵列列表,您可以向其中添加按钮、标签等 为了显示组件,我决定使用一个类主题,它在函数display(Component Component)中有一些重载(一个用于标签,一个用于按钮,一个用于面板等) 在display(Panel-Panel)内部,在某个点上,我显示了面板的所有子项,但它不将它们(子项)视为按钮

我正在处理一个GUI库,我有一个类
组件
。我还有一些扩展
组件的类:
标签
按钮
(扩展
标签
),
面板
图标
。这些类只包含“逻辑”部分(位置、文本、函数检查,如果单击了它们等等)

面板
内部有
组件
阵列列表
,您可以向其中添加按钮、标签等

为了显示组件,我决定使用一个类
主题
,它在函数
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);
}