Java:强制基类使用基类方法而不是重写方法

标签 java oop inheritance

我有一个基类方法,我想在派生类中覆盖它。

只要从“外部”或从派生类访问具有相同名称的方法,就应该调用派生类方法。从基类内部访问方法时,我希望使用基类方法。考虑以下代码:

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
    }
}

我想要以下输出:

Doing something old
-------------------------------
Doing something completely new

但是它产生了这样的输出:

Doing something completely new
-------------------------------
Doing something completely new

我认为在 Basic.this.doSomething(); 中明确声明基类名称应该可以做到这一点,但显然不是。

显然,我可以在 Derived 类而不是 Deriving 中声明一个 Basic 类型的变量,但这种做法违背了 Derived 类“是一个”Basic 类的想法,并且会迫使我编写 oneline-redirection 方法来获得相同的界面。

这就是我想要这样做的原因:

在编写基类时,我想使用可以保证在基类内部使用我编写的方法的方法,因为我不希望派生类干扰基类内部。对我来说,从封装的角度来看这是有道理的,但也许我错了?

Basic#doSomething() 方法可以从 Basic() 构造函数中调用。 如果 Derived#doSomething() 方法使用来自 Derived 的资源,那么这些资源将仅在 Derived 构建之后可用。 但是:Derived 构造在父类(super class)构造之后完成,这意味着当构造 Derived 时,Derived#doSomething()Basic() 构造函数,它将访问未初始化的数据。

有解决办法吗?

最佳答案

从构造函数调用真正的方法是一种不好的做法,更多信息可以在这里找到:On invoking overridable method from constructors

至于强制调用基类方法——那是不可能的。

关于Java:强制基类使用基类方法而不是重写方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29281708/

相关文章:

java - OOPS ( JAVA ) 中的类设计

JavaScript 使类的方法静态并可供其实例使用

java - 当应用程序处于后台时 Android 通知

Python面向对象编程: Composition

c++ - 在派生类中使用抽象类的重载运算符

c++ - 派生对象指针可以存储在基类指针数组中吗?

java - 扩展抽象类后的方法

java - 使用轻量级 Java 游戏库 (LWJGL) 的 3D 对象所需的建议

java - Eclipse 3.4 与 Eclipse 3.6

java - 错误: Unable to access jarfile when I launch a process builder command