【问题标题】:Java override method from another class without inheritance没有继承的另一个类的Java覆盖方法
【发布时间】:2013-06-08 08:51:10
【问题描述】:

我在这里发现了一个类似的问题:
overriding methods without subclassing in Java

但我的有点不同,我有两个类,一个基于 GUI,另一个只是修改第一类元素的方法。如果它只是编辑基本功能,我没有遇到问题,但现在我想从第二类覆盖第一类方法中的 jbutton 而不继承它。我必须从哪里开始?

我有一个临时解决方案,即第二个类扩展 JButton,覆盖我想要的方法,并将该类添加到我的 GUI 类(匿名对象与否,无关紧要)。但是我想找到一种方法来解决我的问题,这甚至可能吗?谢谢:)

编辑
这是示例代码:

第一类,因为它只是jframe中的一个按钮,我只在构造函数中添加这些:
ButtonOverrider bo=new ButtonOverrider(); -> 这是覆盖类
button=bo.overridePaintComponent(bo); //first try
button=bo.overridePaintComponent(); //第二次尝试
bo.overridePaintComponent(bo); //第三次尝试

这是 ButtonOverrider 方法:

public JButton ButtonOverrider(JButton button) {
  button = new JButton() {
    @Override
    protected void paintComponent(Graphics g) {
      Graphics2D g2 = (Graphics2D) g.create();
      GradientPaint gp = new GradientPaint(0, 0,
      Color.blue.brighter().brighter(), 0, getHeight(),
      getBackground().darker().darker());

      g2.setPaint(gp);
      g2.fillRect(0, 0, getWidth(), getHeight());
      g2.dispose();

      super.paintComponent(g);
      super.setContentAreaFilled(false);
      super.setFocusPainted(false);
      super.setBorder(new LineBorder(Color.yellow, 2));
      super.setText("Shuro");
    }
  };
  return button;
}

【问题讨论】:

  • 你能发布最少的示例代码来展示你想要什么
  • overriding 在我的拙见中,如果没有子类化,就其形式意义而言是不可能的
  • @RC。问题已更新
  • 在我看来,您想要做的是decorator pattern。装饰器是一个实现接口并封装同一接口的对象的类。每个方法都可以委托给封装的对象,在这样做之前和/或之后执行代码,或者做一些完全不同的事情。装饰器具有很好的可堆叠能力——你可以将一个对象包装在装饰器中的装饰器中。
  • 您说您的示例与另一个问题中的不同-GUI 类、具有方法的类、匿名类等都是类-因此它们都遵循类的规则.

标签: java overriding


【解决方案1】:

我必须从哪里开始?

具有继承性。这是覆盖有意义的唯一方法。不清楚为什么您不想使用继承,但这确实是覆盖方法的唯一方法。无论您使用匿名类还是命名类都无关紧要,但它必须扩展该类以覆盖该方法。这就是 Java 中覆盖的工作方式。

编辑:您在更新的问题中显示的代码确实通过创建一个匿名内部类来使用继承......但它并没有按照我的预期去做,因为它创建一个 new 对象,而不是覆盖 现有 对象上的方法。您的参数值从未使用过。

【讨论】:

  • @A-SM:那使用继承。那是一个匿名的内部类——你正在扩展JButton。但是您也完全忽略了参数 - 它正在创建一个 new 按钮。
  • :x 我不知道这是否是继承,但如果是,那么应该有一种方法来做我在我的问题中写的内容,对吧?该代码不会改变我的按钮中的任何内容。
  • @A-SM:不,没有办法按照您的要求进行操作,因为您无法更改现有对象的类型。正如我所说,您完全忽略了参数,这就是该代码不起作用的原因。
猜你喜欢
  • 2021-11-30
  • 2016-01-24
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 2013-08-13
  • 2021-05-04
相关资源
最近更新 更多