- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
关于封装和闭包,我真的不明白。我相信封装是不能改变的,除非它被代码改变。但是当我被要求解释如何将闭包和封装应用于代码时,我无法真正理解。
例如 :
(define new-cercle #f)
(let ((n 0))
(set! new-cercle
(lambda (rayon)
(begin
(set! n (+ n 1))
(lambda (msg)
(cond ((eq? msg ’circonference)
(* 2 3.14 rayon))
((eq? msg ’surface)
(* 3.14 rayon rayon))
((eq? msg ’nb-cercles)
n)))))))
n
是封装的吧?所以问题是:解释封装和闭包是如何应用于这段代码的。
let
这里必须高于 lambda 吗?为什么当我把它放在
lambda
下方时,该功能不能正常工作并且没有累加器?
(define acc
(let ((n 1))
(lambda (x)
(set! n (* n x))
n)))
最佳答案
封装模式的名称,涉及任何情况,在这种情况下,将一些相关项放在一个容器中,然后与该容器一起旅行,并通过该容器上的某种访问机制进行引用。这些项目可以是运行时值,或编译时标识符或其他任何东西。一个由多个字段组成的对象封装了字段:a cons
细胞封装car
和 cdr
.一个类封装了槽。在一些对象系统中,方法也是。编译单元封装了它们的全局定义,例如函数和变量。
OOP 中“封装”的流行用法是指将类定义为一个单元,其中包含数据的定义以及对其进行操作的方法:代码和数据是一个“胶囊”。 (Common Lisp 对象系统不是这样的:方法没有封装在类中。)
闭包是另外一种东西,非常具体:它是一个程序代码体,连同它的词法环境,具体化为一个函数类型的对象。闭包的主体在被调用时对两组名称具有可见性:闭包的函数参数,以及创建闭包的词法范围中的周围名称。闭包是封装的一个例子:它将代码体与词法作用域一起封装。进入胶囊的唯一途径是通过函数:函数就像一个“方法”,被捕获的词法环境的元素就像一个对象中的“插槽”。
(通过结合代码和数据,Lisp 闭包比 Lisp 类对象更像封装的流行概念。)
关于那个有趣的词:在计算机科学中,“具体化”程序的某些方面是将一些不是一流对象的东西,并以某种方式将其变成一个。
几乎任何适用于理解程序的可识别概念都可能被具体化。 (聪明的人只需要提出一个关于如何做的明智的建议。)
例如,在给定执行点的整个 future 计算可以具体化,结果对象称为延续(更准确地说是无定界延续)。
当延续运算符捕获 future 计算时,该 future 成为假设:它实际上并没有发生(不执行)。取而代之的是,一个替代的 future 执行,其中将延续返回给运算符(operator)的调用者,或传递到调用者指定的函数中。现在掌握了这个延续的代码可以使用它来显式调用原始的、捕获的 future ,就好像它是一个函数一样。或者选择不这样做。换句话说,程序控制流(执行此块或不执行此块,或执行多次)已成为一个函数对象(调用此函数或不调用它,或多次调用它)。
对象是另一个具体化的例子:模块的具体化。老式程序分为具有全局函数和全局变量的模块。这种“模块”结构是我们可以在程序中识别并有用地应用于描述此类程序的概念。它很容易被具体化:我们可以想象,如果我们有一个“模块”的运行时对象,它具有所有相同的属性:即包含函数和数据,会怎样?而且,presto:基于对象的编程诞生了,具有相同模块的多个实例化等优点,因为变量不再是全局的。
关于 cercle
和 rayon
:
首先,new-cercle
行为类似于对象的构造函数:它是一个可以从任何地方调用的全局函数。它维护已构造的对象数量。只有那个函数可以访问计数器,所以它被封装了。 (实际上不仅那个函数可以访问它,而且代表圆实例的闭包也可以访问它!)这是一个类模块封装的例子。它模拟模块,如语言 Modula-2 和类似语言中的模块,如带有 static
的 C 语言翻译单元。文件范围内的变量。
当我们拨打 new-cercle
我们必须为 rayon
提供一个参数范围。生成并返回一个对象。该对象恰好是作为词法闭包生成的函数。这个闭包捕获了 rayon
参数,从而封装了这个值:对象知道自己的半径。我们可以拨打new-cercle
重复,并获得不同的圆圈实例,每个圆圈都有自己的 rayon
.此 rayon
外部不可见;它被封装在闭包内,并且只对该函数可见。
我们通过容器上的“消息”API 间接访问人造丝容器。我们可以使用消息符号 surface
调用该函数,它通过返回表面积来回答。当前可用的消息均未显示 rayon
直接,但我们可以为此提供访问器消息,甚至是更改半径的消息。甚至还有访问共享变量n
的消息,圆的计数,它的行为类似于对象系统(静态插槽)中的类变量:圆的任何实例都可以报告已经构造了多少个圆。 (请注意,此计数不会告诉我们当前存在多少个圆圈:当圆圈变成垃圾并被回收时,它不会递减:没有最终确定)。
无论如何,我们显然有一个容器,其内容只能通过接口(interface)访问。该容器将代码和数据绑定(bind)在一起,因此它不仅是封装,而且可以说是流行的 OOP 意义上的封装。
关于scheme - 封装和封闭有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34218876/
我需要使用封装打印3个变量,并且无法修改主类。 主类声明变量[汽缸、制造商、所有者],并希望使用如下参数创建和打印一个对象: System.out.println (new Vehicle (cyli
我正在研究“Beginning Ruby”这本书,在我进行封装之前一切都进行得很顺利。我明白这段代码在做什么,我只是不知道为什么要用这些方法设置它。 对于那些感兴趣的人 this is the lin
所以我一直在研究面向对象的完整开发 JavaScript 实践,并对以下示例感到好奇。 据我了解,(这对我来说很有意义)以下“ secret ”字段是“私有(private)”的: var MyObj
在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装、隐藏起来的方法。 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代
封装 被定义为 把一个或多个项目封闭在一个物理的或者逻辑的包中 。在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。 抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可
今天我读了一本书,作者写道,在一个设计良好的类中,访问属性的唯一方法是通过其中一个类方法。这是一个被广泛接受的想法吗?为什么封装属性如此重要?不做会有什么后果?我早些时候在某处读到这可以提高安全性或类
今天我接受了软件工程职位的面试。我已经从 stackoverflow 中阅读了很多关于面试的内容。他们向我询问了与 OOP 相关的正常情况。但他们也问我这些: 没有继承就可以封装吗? 没有继承就可以抽
我正在制作一个简单的网站,并编写了gradle构建脚本,该脚本将执行诸如lint并最小化css / html / js之类的事情。 在这一阶段,我刚刚完成了正在运行的CSS,但是只是初始的非结构化格式
下面的幻灯片是指 C++ 语言,它说 "encapsulation is about ensuring the user uses our ADT in a safe way" 但是,如果他可以访问我
尝试设置一个 Person 类 我在尝试将信息封装在类中以使其不会被意外更改时遇到了问题。除了当我尝试使用 setter/getters 进行封装时,该类工作得非常好。我认为问题是这些方法最终会互相循
面向对象的概念:封装、数据抽象和数据隐藏是3个不同的概念,但彼此之间非常相关。所以我很难通过阅读互联网上的信息来完全理解这些概念。一个地方可用的信息与互联网上另一个地方的信息相矛盾。有人可以指导我阅读
我被封装困住了。在我看来,好像我已经按照规则做了一切,但仍然不起作用。虽然我知道我错过了一些东西。我正在使用 Eclipse。 我想要通过创建一副标准 52 张卡片来进行一些练习,并尝试我学到的新东西
在java中,要获取映射中的所有键,我们可以使用方法keySet。但我想知道为什么方法名称不只是 keys ?名称 Set 是否会泄露有关实现的详细信息? 据我了解,Java 是静态类型语言,名称中包
我正在尝试找出如何防止应用程序中的页面变量被全局定义。我想出了一些方法,但我想知道是否有人们使用的通用标准方法。 我使用这种方法得到了我的插件设计模式:http://www.virgentech.co
我有一个 tcp 连接,我想在服务器类的 HandleConnectionAsync 方法中保持打开状态。它将从客户端接收持续更新。 private async void HandleConnecti
这是我类(class)的一个小样本: #include #include using std::string; using std::vector; struct Book { string
我想要类似下面的代码: class Foo{ public: void update() { for( auto dataModifier : _dataModifierLis
这已经困扰我一段时间了,所以我问了一个同事他是否能理解它,现在我来了;) 为什么可以在依赖属性的 PropertyChangedCallback 中访问持有类的私有(private)成员? 让我通过这
我知道封装意味着一个对象不应该直接访问不同对象的成员……但我猜它与公共(public)领域有关?我假设公共(public)方法不会破坏封装..?我只是在这里不清楚,很高兴得到任何解释。 最佳答案
我就废话不多说了,大家还是直接看代码吧~ ? 1
我是一名优秀的程序员,十分优秀!