在抽象中查看实现细节
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 的功能(方法)即可。但是您不需要研究这些方法的实现。这对用户隐藏了复杂性。他不需要意识到内部的复杂性。
希望对您有所帮助....
抽象的基本定义是隐藏方法的实现复杂性并显示功能。虽然在使用代码时(当我使用 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 的功能(方法)即可。但是您不需要研究这些方法的实现。这对用户隐藏了复杂性。他不需要意识到内部的复杂性。
希望对您有所帮助....