(未完)
由于iPhone等Mac系产品无比红火的存在,Object-C也变得重要起来。Object-C是Apple的御用语言(类似C#之于Microsoft)。如果要开发个iPhone App啥的,就需要用到Object-C。如果要在MacOS里写点基于Cocoa的应用程序,也需要用到Object-C(其实Cocoa有python等其他语言的绑定,不过我试了一下不太喜欢)。话说当年水果教教主Steve Jobs被董事会一脚踢出了自己创立的Apple,就搞了一个Startup叫做NeXT。Object-C就是NeXT从别人手里买下的。Steve Jobs在NeXT待了十年,期间潜心研发硬件软件,修为大为精进。而Apple这段时间却止步不前,终于在1997年被Steve Jobs夺舍而复辟回到了Apple。Steve Jobs顺道也把在NeXT修炼的OpenStep操作系统(打包了Object-C,Cocoa和Xcode等)带回了Apple,也就是后来广为人知的MacOS X。在使用Object-C的时候会发现大量NS开头的类(NeXTstep的意思),就是在纪念这段历史。
Object-C从名字上来看顾名思义就是包括了面向对象的C。道友可能会问,C++不就是用面向对象版的加强的C么?对,但其实现在我们看到的C++是那轮改造中涌现出来的最流行的那个。Object-C和C++都说自己继承了C语言,是C的超集--当你用不到面向对象的时候确实是这样。但是用上面向对象以后,两者的语法就存在着不小的区别。Object-C的面象对象部分其实处处都流露出从更加上古时期就流传下来的Smalltalk的影子。为了以示区别,Object-C中对于C扩充的关键字多以@开头,比如@interface,@end等。
下面开始步入正题:
第一个Object-C程序:Hello World
像学习其他所有语言一样,我们也不能免俗的从Hello World开始。下面是Object-C版本的Hello World
#import <stdio.h> int main( int argc, const char *argv[] ) { printf( "hello world\n" ); return 0; }不难发现,Object-C的Hello World和C版本的基本一样,唯一区别在于把#include换成了#import。没错,谁让Object-C就是C的扩充呢。
面向对象:类的创建
在Object-C当中, 首先用@interface定义一个类的成员变量和成员函数,然后在@implement中实现成员函数
Object-C | C++ |
---|---|
//Foo.h @interface Foo : NSObject { @private: double x; @protected: double y; @public: double z; } -(int) f:(int)x; -(float) g:(int)x :(int)y; @end | //Foo.h class Foo { private: double x; protected: double y; public: double z; int f(int x); float g(int x, int y); }; |
//Foo.m #import "Foo.h" @implementation Foo -(int) f:(int)x {...} -(float) g:(int)x :(int)y {...} @end | //Foo.cpp #include "Foo.h" int Foo::f(int x) {...} float Foo::g(int x, int y) {...} |
调用类方法
Object-C | C++ |
---|---|
[myObj method] [myObj method:para1:para2] output=[myObj method:para1:para2] [obj1 func1:[obj2 func2]] | myObj.method() myObj.method(para1,para2) output=myObj.method(para1,para2) obj1.func1(obj2.func2()) |
Instance Method vs Class Method
在Object-C中,类的方法分为Instance 和Class两种,定义的时候分别使用"-"以及"+". Class method在大多数其他语言比如C++以及Java中又叫静态方法(static method).
@interface MyClass : NSObject + (void)aClassMethod; - (void)anInstanceMethod; @end调用的时候
[MyClass aClassMethod]; MyClass *object = [[MyClass alloc] init]; [object anInstanceMethod];
Duck Typing
同受Smalltalk影响,Object-C和Python一样可以归入Duck Typing:一个类的实例可以调用该类中定义都方法,也可以调用该类中并没有定义的方法。在C++中如果一个类foo没有定义方法bar,那么foo的实例是无论如何也不能调用bar的--编译就无法通过。但是在Object-C(以及Python)中却没有问题--至少在编译期没有问题,但在运行期会有异常.
参考
从C/C++语言到Objective-C语言
Learning Object-C
No comments:
Post a Comment