我正在学习面向对象的概念,其中抽象概念基本上被描述为将实现隐藏在用户之外。因此,如果类中有一个成员函数,并且我们调用该函数执行某些任务,抽象化意味着用户不应关心如何完成任务,而只应知道正在完成什么。但即使在非面向对象编程风格中,如果我们编写一个函数,整个任务也可以通过简单地调用一个函数来完成。这是否也遵循了抽象逻辑?或者说,在面向对象编程和函数式编程中的抽象有什么区别吗?
我正在学习面向对象的概念,其中抽象概念基本上被描述为将实现隐藏在用户之外。因此,如果类中有一个成员函数,并且我们调用该函数执行某些任务,抽象化意味着用户不应关心如何完成任务,而只应知道正在完成什么。但即使在非面向对象编程风格中,如果我们编写一个函数,整个任务也可以通过简单地调用一个函数来完成。这是否也遵循了抽象逻辑?或者说,在面向对象编程和函数式编程中的抽象有什么区别吗?
提供抽象的不是函数的调用本身,而是调用方式。例如,您可能有一个允许您编写文本行的函数:
void writeLine(string fileName, string value)
但这并不是抽象出来的事实,因为你正在写入文件。抽象化的版本不需要调用者提供fileName
参数,因为它是特定于该函数实现的。相反,你将拥有:
void writeLine(string value)
如果您正在使用面向对象编程并调用writeLine方法,或者在函数式情况下,可以对原始函数进行柯里化以创建抽象版本,则可以使用另一种机制(例如类的构造函数参数)提供fileName。
Writer
和不同实现FileWriter
和ConsoleWriter
,但这不是抽象化的核心所在。用户不知道也不关心行的精确写入方式,这才是重要的。 - VLAZlog(someData)
,然后将其输出到文件、控制台、网络位置,甚至可能同时输出到多个位置。因此,接受文件名的方法本质上并不缺乏抽象化。 - VLAZinterface Writer {
void write(byte[] bytes)
}
这个接口允许用户写入...某些内容。具体是什么我们不太担心。我们可以有多个版本:
class FileWriter implements Writer
class StringWriter implements Writer
class LogWriter implements Writer
class MySuperCustomWriter implements Writer
我们写代码的地方并不重要,可以是文件
、字符串
、套接字或其他任何地方。我们只想往某个地方写入内容。这样,我们就可以编写如下代码:
public class MyBusinessLogic {
private final Writer writer;
public MyBusinessLogic(Writer writer) {
this.writer = writer;
}
void someBusinessLogic() {
// ..
writer.write(someStuff);
}
}
快速封装示例
type
public class DateTimeClass
private
Era: integer;
Culture: integer;
Year: integer;
Month: integer;
Day: integer;
protected
Integer function getYear ( );
// other functions
procedure setYear ( );
// other functions
public
procedure AssignOccidentalDate
(NewYear: integer; NewMonth: integer;
NewDay : integer);
end;
...
var Date: DateTimeClass;
Date.AssignOccidentalDate (2019, 07, 27);
...
你只能访问“public”声明。