Objective-J简明教程3-1:类、方法
2009年05月26日 Web开发, 翻译
官方网站原文:Learning Objective-J
![]()
Objective-J是一门基于Objective-C的新编程语言,是JavaScript的超集。换句话说,任何有效的JavaScript代码同样也是有效的Objective-J代码。对于熟悉JavaScript及面向对象编程概念,特别是熟悉经典继承机制的读者而言,学习Objective-J并不难。熟悉Objective-C会有所帮助,但不是必需的。
类
Objective-J有两种对象:本地JavaScript(以下简称“JS”)对象和Objective-J对象。本地JS对象就是JavaScript内置的那些对象。Objective-J对象则是Objective-J添加的另一种本地对象。这些新增的对象基于类和经典继承构建(与C++或Java相似),而不是基于原型式继承构建。
在Objective-J中创建一个类很简单。下面就是一个Person类的代码,该类包含一个成员变量name:
@implementation Person : CPObject
{
CPString name;
}
@end
类定义始终以关键字@implementation开头,后跟类名。冒号后面的第三个项是要子类化的类。在这个例子中,我们想要子类化CPObject,而它是大多数类的顶级(root)类。你可能不需要超类,但终归还应该有一个比较稳妥(You don’t need a superclass, but nearly all the time you will want one.)。
在类声明之后,包含在一对花括号中的代码块,用于定义类的成员变量。每个变量声明独占一行,格式是类型、变量名和一个分号。从技术上角度讲,类型是可选的,但我们强烈建议不要省略它。声明变量的类型非常重要,如果不在类中声明成员变量的类型,该变量就会变成全局变量。
类定义的最后,需要添加一个@end关键字。
方法
跟对象一样,本地JavaScript函数在Objective-J中也没有什么不同。除了本地函数之外,Objective-J则为新的类系统添加了方法的概念。下面我们就为Person类添加一组访问器(accessor)方法:
- (void)setName:(CPString)aName
{
name = aName;
}
- (CPString)name
{
return name;
}
以上这些代码位于定义类的@implementation行及声明实例变量的代码块之后、@end关键字之前。熟悉C语言(包括JavaScript)编程风格的读者对这种语法应该不会陌生。这里唯一需要说明的就是方法声明。
每个方法签名以一个减号(-)或一个加号(+)开头。短划线表示实例方法,即能够基于实例变量调用的方法。由此可见,上面的两个方法都应该是实例方法,因为这两个方法的用途分别是设置和取得Person对象的实例变量。
减号/加号的后面是由一对圆括号包围的类型。这也没有什么特别的。同样,这里的类型声明虽然也是可选的,但我们仍然要强烈推荐,因为它有助于理解代码。最后,就是方法名。在Objective-J中,方法的参数与方法名是掺混在一块的。上面定义的两个方法分别是name和setName:,注意“setName”之后的冒号,这表明后面是一个参数。
如果某个方法有多个参数,则以冒号分隔每个参数。在下面的方法声明中,两个参数由一个标签(label)分隔,之后是冒号、类型和参数名:
- (void)setJobTitle:(CPString)aJobTitle company:(CPString)aCompany
在Objective-J中,方法名可以被其参数分隔开来。从技术上说,被分隔开的方法名并不命名参数;即上面的方法名是setJobTitle:company:。把方法名的第一部分与后续的标签按照次序连接起来,就是“实际的”方法名。
方法的参数必须按顺序传递,而且必须传递所有参数。例如,要调用上面定义的多参数方法,需要在每个标签后面传递数据:
[myPerson setJobTitle:"Founder" company:"280 North"];
这里,我们在每个冒号后面都指定了与参数名对应的输入值。对每个参数来说,都要重复“标签、冒号、输入”的格式。
有读者可能会问:实际的方法名是什么还有那么重要吗?在Objective-J和Cappuccino中,读者可以发现一种模式,即能够将方法作为参数传递给另一个方法。这种思想常见于委托和事件系统中。但是,由于Objective-J的方法不像JavaScript中那样是一类对象,因此引用它们需要使用特殊的表示法——@selector。如果想把前面的方法作为参数传递给另一个方法,可以使用下面的代码:
[fooObject setCallbackSelector:@selector(setJobTitle:company:)];
由此可知,通过@selector引用(并传递)的方法名需要包含冒号及相应的参数标签。
为之漫笔(李松峰),本博客专注于Web前后端技术、移动平台开发技术、交互设计和技术翻译。声明一下,因为时常需要外出审稿,而且基本不带笔记本,所以有时可能会迟一点回复大家的留言。
[...] Objective-J简明教程3-1:类、方法 使用对象和类 [...]
[...] 相关内容Objective-J简明教程3-1:类、方法 Objective-J简明教程3-2:使用对象和类、导入代码 六月 1st, 2009 in Web开发, 翻译 [...]
The internal belted sides can be adjusted to give more space inside.
I hope you can have a nice day!
Thank you for sharing your stuff on blog. It is doubtless that we have similar interests. Something are very helpful to me.
Thank you for sharing your stuff on blog. It is doubtless that we have similar interests. Something are very helpful to me.///
Old Farmer Johnson was dying. The family was standing around his bed. With a low voice he said to his wife: “When I’m dead I want you to marry farmer Jones.”
Wife: “No, I can’t marry anyone after you.”
Johnson: “But I want you to.”
Wife: “But why?”
Johnson: “Jones once cheated me in a horse deal!”
YES! I finally found this web page! I’ve been looking just for this article for so long!!
http://www.menacorde.com/wordpress/?p=608
good arctile , thanks for sharing it and please keep doing this good job .
good post , i like it , thanks for sharing it . have a nice day .