在抽象中查看实现细节

Seeing the implementation details in abstraction

抽象的基本定义是隐藏方法的实现复杂性并显示功能。虽然在使用代码时(当我使用 eclipse 时)有一个选项可以打开抽象方法的实现。

例如:-

我试图打开实现,因为 BufferedReader 能够看穿许多实现。

那么当我们能够看到实现时,我们是如何隐藏复杂性的。

我在概念上哪里出错了?

抽象并不意味着在物理上对您隐藏实现细节。除非您有眼睛,否则您仍然会看到已实现的抽象方法的所有实现行。抽象意味着将实现细节隐藏在代码中如何使用该方法的细节中。

假设您正在编写 class 来逼近函数的导数。哪个功能?如果您将函数视为抽象,那并不重要。 你不关心函数是什么。您只需定义一些关于如何实现该功能的基本原则。它应该采用双精度值并且应该 return 双精度值。

这个概念向您和 class 的设计者隐藏了函数实现的复杂性。您现在可以继续执行您的工作。你可以这样写 class:

public abstract class DerivativeApprox {

    abstract double func(double x);

    double eps = 0.0;

    DerivativeApprox(double eps){
        this.eps = eps;
    }

    public double eval(double xPoint){
        return (func(xPoint + eps) - func(xPoint - eps)) / (2 * eps);
    }
}

现在任何人都可以通过以下方式使用您的 class(负责实现他们想要估计导数的任何特定函数)

public static void main(String[] args) {

    DerivativeApprox cosDerApprox = new DerivativeApprox(0.0001) {
        @Override
        double func(double x) {
            return Math.cos(x);
        }
    };

    DerivativeApprox sinDerApprox = new DerivativeApprox(0.0001) {
        @Override
        double func(double x) {
            return Math.sin(x);
        }
    };

    System.out.println("Cos'(pi) = " + cosDerApprox.eval(Math.PI));
    System.out.println("Cos'(pi/2) = " + cosDerApprox.eval(Math.PI / 2));

    System.out.println("Sin'(pi) = " + sinDerApprox.eval(Math.PI));
    System.out.println("Sin'(pi/2) = " + sinDerApprox.eval(Math.PI / 2));

}

希望这个解释对ypu继续OOP学习有所帮助。

你的定义是正确的,抽象是隐藏了方法的实现复杂性并显示了功能。但这只是编程中的一个概念。它不是用于隐藏 class 或模块的实现细节的技术。您可以访问 java 库中的任何预定义方法或 class 并探索它们。

但是抽象的优点是,它使我们有可能在不了解其实现细节或内部结构的情况下使用 classes 或方法。

假设您是第一次使用 BufferedReader class。您只需要了解 class 的功能(方法)即可。但是您不需要研究这些方法的实现。这对用户隐藏了复杂性。他不需要意识到内部的复杂性。

希望对您有所帮助....