fat*_*yte 2 java oop inheritance
我有一个Base类方法,我想在Derived类中重写.
只要从"外部"或派生类访问具有相同名称的方法,就应调用派生类方法.当从基类内部访问该方法时,我希望使用基类方法.请考虑以下代码:
public class TestBaseMethod
{
static class Basic {
public Basic()
{
Basic.this.doSomething(); // <<---- This should call Basic version
}
public void doSomething()
{
System.out.println("Doing something old");
}
}
static class Derived extends Basic {
Object ressource = new Object();
@Override
public void doSomething()
{
System.out.println("Doing something completely new");
// ressource.toString(); // <<---- explosion
}
}
public static void main(String[] args)
{
Basic d = new Derived();
System.out.println("-------------------------------");
d.doSomething(); // <<---- This should call Derived version
}
}
Run Code Online (Sandbox Code Playgroud)
我想要以下输出:
Doing something old
-------------------------------
Doing something completely new
Run Code Online (Sandbox Code Playgroud)
但它产生了这个输出:
Doing something completely new
-------------------------------
Doing something completely new
Run Code Online (Sandbox Code Playgroud)
我认为明确说明基类名称Basic.this.doSomething();应该这样做,但显然它没有.
显然,我可以在Derived类中声明一个Basic类型的变量而不是Deriving,但是这种类型会破坏Derived类"is-a"Basic类的想法并强迫我编写oneline重定向方法以获得相同的接口.
这就是我想要这样做的原因:
在编写基类时,我想使用的方法是我保证在基类中使用我编写的方法,因为我不希望派生类干扰基类内部.对我来说,从封装的角度来看,这是有道理的,但也许我错了?
Basic#doSomething()可以从Basic()构造函数中调用该方法.如果该Derived#doSomething()方法使用ressources Derived,那么这些资源只能在Derived构建后使用.但是:Derived构造在超类构造之后完成,这意味着在Derived构造时,在构造函数Derived#doSomething()中调用Basic()它,它将访问未初始化的数据.
有没有解决的办法?