我有一个现有的框架,我无法更改,它会读取2个属性
ClassA=somepackage.AnImplementationOfInterfaceA
ClassB=somepackage.AnImplementationOfInterfaceB
在public methodA
new ClassA()
上按{1}}按顺序拨打public methodB
我想创建一个实现接口A,B的new ClassB()
,并为class C
提供钩子methodC1
,methodC2
以覆盖(class D
& { {1}}包含许多样板文件和要实现的复杂功能 - methodA
& methodB
将封装业务逻辑)。然后我的属性将是
methodC1
methodC2
问题在于,实施D类的人可能会想要写一些类似的东西:
ClassA=somepackage.classD
但这不会按预期工作,因为在调用ClassB=somepackage.classD
,class 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
的新对象,因此不能依赖于使用“这个”参考。
将methodA
,methodB
定义为methodC1
也不会有效,因为对methodC2
的调用与static
中的实现相关联,而不是覆盖methodC1
中的一个。
当真正应该写的是:
C
我还希望仅 D
,class 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
理想的设计会有
methodC2
,methodA
属于该班级挑战摘要
methodC1
,methodC2
中没有this
methodC1
,methodC2
methodC1
如何设计此框架?这甚至可以解决吗?您可以更改methodC2
,static
。
答案 0 :(得分:0)
组合物!建立一个你可以随时扩展的界面。
此类将包含MethodD1和D2的逻辑,对于其他所有内容,只需简单调用当前现有类中的其他方法。人们将无法修改调用以更改基础逻辑。
答案 1 :(得分:0)
无法覆盖静态方法!
如果子类定义的静态方法与超类中的静态方法具有相同的签名,则子类中的方法会隐藏超类中的方法。隐藏和覆盖之间的区别具有重要意义。