说说Object c的动态性
今天写了一天的iphone程序,被iphone sdk发短信的功能折磨了一天, 苹果允许的发短信支持貌似仅限于sms://这样的url,这样做每次程序都要被迫中断,实在不爽,查阅了大量文档发现只有使用private framework才能自由的发送短信,而这又是苹果不允许的,不知道苹果下一版的sdk能否适当开放下短信发送的限制。
郁闷之余还是有所收获,那就是感叹object c这门语言在动态性方面确实牛逼,要不是之前用过python、lua这样完全动态语言,真要被这种语言的动态性折服,难怪jobs放言object c是王道,并声称object c才是开发mac、iphone程序的首选, 先来说说最大的感叹之处, 那就是object c可以在不修改原始代码的情况下,往原类中添加新的成员方法,例如:
在string.h中有如下定义:
@interface string {
}
- (const char*) asUtf8;
@end
现在有需求,需要扩展string类的功能,加入asGbk方法,但string类不是我们自己写,我们一般的做法是继承一个mystring,或者写一个utility函数,完成这种转换,但在object c中,可以这样写
新建stringex.h,如下定义:
@interface string (stringex )
- (const char*) asGbk;
@end
使用时记得#import “stringex.h“ 就可以了。
这样语法我在object c的手册里没有找到具体如何称呼(也可能视而不见,请各位指点),我暂且称之为编译期插入成员方法。
上面的语法,还可以成为sugar,毕竟这是在编译期完成的(难为gcc了),不过下面的语法则是完全动态。
在object c里,所有成员方法的调用都是发送消息-即所有方法的调用都是动态的,而object c为此也引入了一个难看的语法,如:
string* str = [string alloc]; //这里含义是调用string的静态方法alloc,string::alloc()
注意,alloc在上面定义中并不存在,但这样写不会error,而是warning,说明编译期不依赖alloc函数必须存在。
const char* utf8 = [str asUtf8]; //这里是调用方法asUtf8, str->asUtf()
有了这样的语法支持,那么就可以实现很多传统c++无法实现的设计模式,比如代理/协议模式, 目标/动作模式,这些模式在iphone sdk中随处可见。
最后再引出object c泛型支持就最自然不过了,再object c中id类型可以被赋值任何数据,类似与d语言auto,或者干脆就是python等脚本语言变量,例如:
id str = [string alloc];
const char* utf8 = [str asUtf8];
最后说下多态, 在c++中, 多态是指运行时确定的成员方法, 但c++中的动态仅限于继承树上的类, 所有类指针存在is a关系, 而object c显然没有这样限制, 比如circle和rectangle都有display方法, 但明显rectangle和circle没有继承关系, 在c++中, 这样的类是不存在多态调用的, 但object c可以, 例如:
circle* c=[circle alloc];
rectangle* r=[rectangle alloc];
id shape = i==1?c:r;
[shape display];
说说Object c的动态性相关推荐
- 如何将键/值对添加到JavaScript对象?
这是我的对象文字: var obj = {key1: value1, key2: value2}; 如何向对象添加{key3: value3} ? #1楼 您可以使用其中任何一个(提供的key3是您要 ...
- Java 编程的动态性,第 8 部分: 用代码生成取代反射--转载
既然您已经看到了如何使用 Javassist 和 BCEL 框架来进行 classworking (请参阅 本系列以前的一组文章), 我将展示一个实际的 classworking 应用程序.这个应用程 ...
- Java 编程的动态性,第 7 部分: 用 BCEL 设计字节码--转载
在本系列的最后三篇文章中,我展示了如何用 Javassist 框架操作类.这次我将用一种很不同的方法操纵字节码--使用 Apache Byte Code Engineering Library (BC ...
- Java编程 的动态性,第 2部分: 引入反射--转载
在" Java编程的动态性,第1部分,"我为您介绍了Java编程类和类装入.该篇文章介绍了一些Java二进制类格式的相关信息.这个月我将阐述使用Java反射API来在运行时接入和使 ...
- Java 编程的动态性 第1 部分: 类和类装入--转载
原文地址:http://www.ibm.com/developerworks/cn/java/j-dyn0429/ 本文是这个新系列文章的第一篇,该系列文章将讨论我称之为 Java 编程的动态性的一系 ...
- Java面试题 22 牛客 Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持
Java面试题 22 牛客 Java是一门支持反射的语言,基于反射为Java提供了丰富的动态性支持,下面关于Java反射的描述,哪些是错误的:( ) A Java反射主要涉及的类如C ...
- 菜鸟学习笔记:Java提升篇12(Java动态性2——动态编译、javassist字节码操作)
菜鸟学习笔记:Java提升篇12(Java动态性2--动态编译.javassist字节码操作) Java的动态编译 通过脚本引擎执行代码 Java字节码操作 JAVAssist的简单使用 常用API ...
- 菜鸟学习笔记:Java提升篇11(Java动态性1——注解与反射)
Java提升篇11(Java其它高级特性--注解与反射) 注解(Annotation) JDK内置注解 自定义注解 元注解(meta-annotation) 反射(reflection) 动态语言 反 ...
- [Object]面向对象编程(高程版)(二)原型模式
[Object]面向对象编程(高程版)(二)原型模式 博客分类: Web前端-JS语言核心 作者:zccst 三.原型模式 每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个 ...
最新文章
- libusb中的热插拔使用举例
- 大一计算机期末考试高数试卷,高等数学大一期末试卷(A)及答案
- 把二元查找树转变成排序的双向链表(树)
- 新手python爬虫代码_新手小白必看 Python爬虫学习路线全面指导
- python脚本批量生成数据
- 23天的单车旅行,从广州到四川,篇首语
- idea本地跑如何看gc日志_线上故障如何快速排查?来看这套技巧大全
- gitee怎么仓库间传文件_实现一个简单的基于码云(Gitee) 的 Storage
- lnmp基于fastcgi实现nginx_php_mysql的分离_LNMP基于FastCGI实现Nginx,PHP,MySQL的分离
- CentOS 5 上安装git
- 菜鸟学了SpringBoot后,撸了个博客项目(大神跳过哈)
- oracle报sp20042,oracle中ora-04301故障处理
- 让基础设施代码化更加容易,pulumi 都做了些什么?
- fastq质量值_高通量测序数据的质量控制FastQC
- vue项目history路由的配置
- 嵌入式linux 内核移植篇
- 拉普拉斯(逆)变换的计算
- 网络其他计算机无法访问,win7局域网别人无法访问我的电脑是为什么 win7其他电脑无法访问我的电脑如何修复...
- html 复选框事件,HTML复选框选中与未选中触发事件的方法
- mybatis基础(下)
热门文章
- donate.ouyangsong.com
- 计算机键盘的功能键在哪,台式电脑home键在哪里(有关电脑按键作用介绍)
- 高斯-约当消元法(随机程序,UVA 10828)
- JVM 判断对象已死,实践验证GC回收
- 艾司博讯:拼多多批量发货怎么做?
- MFC Windows 程序设计[五十六]之开启子对话框(附源码)
- FTDI(FT220XQ)(一)——USB转SPI芯片的使用之驱动安装及设备信息配置
- 安卓Android手机直播推送同步录像功能设计与实现源码
- Generalized Function Pointers
- 解决垃圾小米文件管理器删除文件后存储空间不变,内存不变大,不释放空间。解决方法:点图中那个结束运行,再重新打开软件(直接滑动退出后台无效果)