这可能与语言相关的问题无关.由于Swift是我目前正在学习的语言,所以我在这里使用它.
我从Matt Neuburg的书" iOS 10编程基础与Swift"中选择了这句话
In Swift, "everything is an object" and an object Object is something you can send a message to.
我们来举个例子吧.假设有一个名为Dog的客户类型.它有bark()和sit()函数.已经启动了两个名为fido和rover的Dog类型的实例.
In swift, the syntax of message-sending is dot-notating, like fido.bark() rover.sit() rover.printName() The above code lines means sending message to object fido and rover
问题1:
为什么描述是:向对象fido和流浪者发送消息?对我来说,看起来fido和rover这个对象会发出一些消息在控制台中打印出来(例如printName())而不是我们向它发送消息..bark()看起来它会使fido做某事并将其反应射向外部世界,因为bark()是其腹部的功能,而不是我们创造并注入其身体的东西.我们只是通知这个功能它的工作时间.这个通知对象做特定的事情是将消息发送给对象的意义吗?
问题2:
"In Swift, everything is an object", an object is something you can send message to
如果我理解正确,即使对象类型本身也是一个对象.例如String,Int或Double.因为type具有类型属性,这意味着您可以向其发送消息
非常感谢你的时间
在OOP世界中,关于"消息传递"与"方法调用"之间存在一些争论,包括我们如何谈论它们以及它们是如何实现的.在典型的OOP语言(SmallTalk,其中ObjC是其后代)中,一切都是"消息".我捆绑了一条消息(这是一个真正的数据结构,NSInvocation
在Cocoa中以其最重量级的形式),并将其传递到对象的收件箱,然后该收件箱处理消息并执行某些操作.
最常见的OOP语言并没有适应这种模式(当今天的某些事情发生时,我们倾向于将其称为"演员"而不是"对象").C++在很大程度上激发了当前"面向对象"语言的大部分内容,采用了"方法调用"方法.这与函数调用更紧密地对齐,并且与跳转到内存中的特定点并在那里执行指令有关.方法调用比消息传递更静态.在运行时更容易完全重新配置消息的处理方式,创建新的消息处理程序,重新路由旧的消息处理程序等.方法调用要快得多.
实际上,大多数呼叫站点的大多数节目都没有太大差异.绝大多数ObjC"消息"精确地将1:1转换为方法调用,并且系统几乎总是避免生成完整NSInvocation
消息(它们非常昂贵).
但是,当我们教授OOP时,我们仍然在概念上混合了这两个想法,这就是这里发生的事情.(斯威夫特也恰好采用了这两种机制.)
想到的一个好方法fido.bark()
是"发送bark
消息,没有参数fido
." 然后由Fido决定该怎么做.在实践中,消息通常被理解为"命令",因为对象不"决定"做什么.但原则上它可能会.例如,Fido可能是一只非常聪明的狗,并决定不吠叫,因为它已经很晚了,即使你告诉他,或者他可能已经睡着了,他不喜欢吠叫.对象的概念是它们封装了知识和状态.
对于你的第二个问题,Swift类型不是完整的对象.他们是"元对象".你完全可以向他们发送消息,因此他们在某些方面表现得像对象一样.但是Swift没有"第一类类型",这意味着你不能用一个类型完成对象所做的一切.但是,是的,你肯定是在正确的道路上,在许多情况下,你可以把一种类型视为一个对象.
(一个主要的Swift特性请求是通过添加一个名为Higher Kinded类型的概念来使类型更加一流.这样就可以在Array
自身上编写方法,而不是只在on上编写方法Array
,并使一些类型,如Functor,可以编写根本.)