覆盖函数而不扩展类

时间:2012-08-13 06:33:16

标签: java

假设我有一个A类:

public class A {
    public A(){....}
    public void method1() {...}
};

该类的一个实例:

A anA = new A();

有没有办法只为method1()覆盖anA? 这个问题出现在我写一个小绘画程序时,我必须多次扩展JPanel类,只是为了对具有略微不同特征的不同面板进行微小的改动。

3 个答案:

答案 0 :(得分:46)

您可以执行以下操作:

A anA = new A() {
    public void method1() {
        ...
    }
};

这与:

相同
private static class myA extends A {
    public void method1() {
        ...
    }
}

A anA = new myA();

除非在这种情况下可以重复使用myA。匿名课程无法做到这一点。

答案 1 :(得分:13)

只要您使用类A的no-arg构造函数,就可以动态创建一个新的匿名类:

A anA = new A() {

  @Override
  public void method1() {
    ...
  }
};

请注意,您要做的事情非常接近所谓的 lambda ,它应该出现在Java SE的下一个版本8中。

答案 2 :(得分:3)

我喜欢用代表或“策略模式”来做这种事情。

public interface ADelegate {
   public void method1();
}

public class A {
    public A(){....}
    public ADelegate delegate;
    public final void method1() { delegate.method1(); }
};

A anA = new A();
anA.delegate = new ADelegate() {
   public void method1() { ... }
};