覆盖方法并使其表现为静态

时间:2012-05-08 04:02:13

标签: java oop design-patterns

我有一个现有的框架,我无法更改,它会读取2个属性

  • ClassA=somepackage.AnImplementationOfInterfaceA
  • ClassB=somepackage.AnImplementationOfInterfaceB

public methodA new ClassA()上按{1}}按顺序拨打public methodB

我想创建一个实现接口A,B的new ClassB(),并为class C提供钩子methodC1methodC2以覆盖(class D& { {1}}包含许多样板文件和要实现的复杂功能 - methodA& methodB将封装业务逻辑)。然后我的属性将是

  • methodC1
  • methodC2

问题在于,实施D类的人可能会想要写一些类似的东西:

ClassA=somepackage.classD

但这不会按预期工作,因为在调用ClassB=somepackage.classDclass D extends class C { private int foo; //must be non-static due to multi-threaded new Class D() calls going on int methodC1() {this.foo = read number from network} methodC2(int x) {y = this.foo;} //methodC2 is always called after methodC1 //methodA, methodB implementation inherited from C } 之前,框架实际上每次都会创建class D的新对象,因此不能依赖于使用“这个”参考。

methodAmethodB定义为methodC1也不会有效,因为对methodC2的调用与static中的实现相关联,而不是覆盖methodC1中的一个。

当真正应该写的是:

C

我还希望 Dclass D extends class C { int methodC1() {return number from network;} methodC2(int x) {y = x} //here y is using the return value of methodC1 //methodA, methodB implementation inherited from C } 可以覆盖,即在D上工作的程序员不能搞砸methodC1

理想的设计会有

  • 属性仅指一个类
  • methodC2methodA属于该班级

挑战摘要

    {li> methodC1methodC2 中没有this
  • 无法methodC1methodC2 methodC1
  • 本地只需要一个可实例化的类

如何设计此框架?这甚至可以解决吗?您可以更改methodC2static

的签名

2 个答案:

答案 0 :(得分:0)

组合物!建立一个你可以随时扩展的界面。

此类将包含MethodD1和D2的逻辑,对于其他所有内容,只需简单调用当前现有类中的其他方法。人们将无法修改调用以更改基础逻辑。

答案 1 :(得分:0)

无法覆盖静态方法!

如果子类定义的静态方法与超类中的静态方法具有相同的签名,则子类中的方法会隐藏超类中的方法。隐藏和覆盖之间的区别具有重要意义。