官方网站原文: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引用(并传递)的方法名需要包含冒号及相应的参数标签。

相关内容

Objective-J简明教程3-2:使用对象和类、导入代码
Objective-J简明教程3-3:内存管理、类目、作用域

5月24日(上周日)跟小白到天通苑“世奥得众人从乒乓球俱乐部”打球,碰巧上午10点有一场技术讲座。老板跟我说,这次请到的是国家高级教练员王吉生老师,还说王老师的文笔不错,写过不少书。提别人我可能不知道,但王吉生老师我可不陌生。我打球以来第一次郑重其事地换球拍,就缘自看了王老师的那本《乒乓球拍探秘》。真是巧啊!因为我和小白原本都是每周六上午来打球(顺便送孩子上乒乓球课),但赶上周六小白他们公司组织春(还算不算春天啊?)游,所以才改为周日。

10点前,设在里间的会场布置好了;撤掉了3张台子。我挑了第一排的座位,一是没带眼镜,二是怕没话筒听不清。9点50左右,一位身材稍胖,年逾六旬的高个子老者走进俱乐部。他上身穿黄色半袖乒乓球衣,下身穿深蓝色运动长裤,肩挎一个大运动包,身边还跟着一位小伙子。进入会场后,距离近了,我才看清,确实是王吉生老师。不过,跟《乒乓球探秘》封底的照片相比,大约差了有10岁。

10点整,讲座正式开始。王老师开门见山,一上来就给出了讲座的主题和提纲。他说,今天主要讲一讲弧圈球,分三个方面展开,首先讲弧圈球的起源和发展变化,然后讲讲弧圈球的动作要领,最后再讲一下怎样拉出更有威力的弧圈球。以下就是我通过回忆,记录的王老师讲课的内容要点。

一、乒乓球的起源及发展变化

乒乓球由日本人发明,后来传入欧洲。欧洲人将弧圈球发扬光大,不像日本人只会正手拉,而是创造了正反手两面拉的打法。但是,第一代弧圈球打法,不能将打和拉分开,是两个动作,影响协调,不利于连续击球。到了瓦尔德内尔和佩尔森时代,才真正解决打拉结合的问题——即通过将球拍立起来,用手腕调节其前倾/后仰角度,实现打和拉的无缝结合。比如,在触球瞬间,拍形前倾,摩擦多一些,就是拉;拍形后仰,撞击多一些,就是打。

然而,纵观世界乒坛,对弧圈球(或者说乒乓球)理解最深、最到位的,还要数中国人。例如,韩国人认为乒乓球致胜的要素,一是发球接发球,二是步伐灵活(能追上球),三是发力。但只有中国人抓住了要害,即中国人把现代乒乓球致胜的要素归结为:速度、力量、旋转、落点和弧线,一共5个因素。这5个因素在实战中可以有无数种组合,都可以构成致胜要素。例如,力量小但落在了对方空档区域的球,同样可以致胜。不过,在这5个因素中,挑战人类极限的只有速度。因为人反应需要一定的时间,只有速度才能挑战人的极限,所以也就成为这5个因素中的核心。也就是说,不管什么球,无论其力量大小、旋转强弱、落点优劣、弧线高低,只要速度够快,对方没时间反应,就能致胜。

但是,外国人认为我们理解得太复杂了;或者说,他们理解不了中国人的思想。

二、弧圈球的动作要领

拉弧圈球,最重要的是协调和发力。力量当然要源自身体,但最重要的是要知道,只有以支撑腿为轴(右手就是右腿)的旋转,才是关键。通过旋转身体,带动胳膊旋转向前,然后力量再通过小臂、通过手指(直拍背后的中指,横拍背后的食指)尖,传递给球面的有效击球区域。

三、哪种弧圈球最有威力

弧圈球有3种,取决于击球点。第一种击球高点,球在对方台面弹出后,弧线同样高;第二种击球下降前期,球在对方台面弹起后,弧线低平;第三种击球下降后期,此时摩擦较多,球在对方台面弹起后,会有变速,即向下沉。

总而言之,第一种和第三种弧圈球给对方造成的困难较大,不易回接。因为,第一种球向前拱,对方不易发力;第三种球,变速后下沉,要求对方在很短时间内反应,并抢到其上升期击球。

谢谢王老师!

王老师简介

王吉生,1946年生 籍贯:浙江。 

60年代是北京乒乓球队运动员,70年代开始担任练习员以来曾先后培训出阎桂丽、魏力婕、杨燕群、赵晓云等多名世界级优秀国手和全国冠军,曾被中国乒协评为优秀教练员。 

80年代曾先后应邀担任索马里、巴基斯坦等国家乒乓球队主教练,多次获得重大国际比赛冠军。是我国第一批高级教练员。 

90年代以后,投入乒乓球器材的研制开发,先后创造了“四拓”“郗恩庭”“世奥得”等多个知名品牌。并多次在“乒乓世界”上发表文章。