我对编程java的好习惯提出了一个问题。
问题是:
我正在覆盖在类B中声明的方法。这个覆盖的方法将在C类中。层次结构是C类扩展B,它扩展了A. 该方法存在于每个类中,如下所示:
class A{
...
public void overrideMe(){ ... }
}
class B extends A{
public void overrideMe(){
...
...
super.overrideMe()
}
}
这些类对于每个项目都是通用的,并且由于这些原因项目很多,除非特殊情况,否则我无法修改此类。
我必须覆盖方法overrideMe()以在内部添加代码,但在方法结束时我仍然需要类A的调用方法。
现在问题是两个,更好:
1)在B类中创建一个只调用A类方法overrideMe()并扩展overrideMe()的方法:
class B extends A{
public void callOverrideMeOfSuperClass(){ super.overrideMe(); }
public void overrideMe(){
...
...
super.overrideMe()
}
}
class C extends B{
public void overrideMe(){
...
super.callOverrideMeOfSuperClass()
}
}
2)在B类中创建一个自定义方法,此方法将包含在B类的overrideMe()中,并且仅针对我在C类中的项目进行扩展:
class B extends A{
public void customCode(){ (not code inside) }
public void overrideMe(){
...
customeCode();
...
super.overrideMe()
}
}
class C extends B{
public void customeCode(){
do something;
}
}
仅供参考:这些类A和B是更多的方法和代码。
好的,问题是我们必须给予重要性:
1)java的良好编程实践 2)对代码的影响较小 3)对所有项目的影响较小。这些项目是不同的项目,但共享一个共同的基本代码。 4)如果我更改公共代码,每个项目都要检查此代码,以确保对项目没有影响。
第一个解决方案或第二个解决方案更好吗?为什么?
谢谢所有!!
RainJoker
答案 0 :(得分:1)
通常,期望派生类扩展的代码会以您呈现的第二种形式实现方法。
这些方法通常被命名为doOriginalMethodName
,因此在您的情况下为doOverrideMe
。
这确保了原始代码的执行加上派生代码的行为。
以下是一些示例代码:
public class A {
public void extendMe() {
// modify internal state
...
// allow extension
doExtendMe();
}
protected void doExtendMe() {
}
}
public class B extends A {
@Override
protected void doExtendMe() {
// modify state of B
...
}
}