当前位置:文档之家› Object-C的语法与Cocoa框架 V1.0

Object-C的语法与Cocoa框架 V1.0

Object-C的语法

语法与与Cocoa框架

李海峰QQ:61673110 邮箱:andrew830314@https://www.doczj.com/doc/3e2258174.html,

Object-C是苹果Mac OS X、iOS平台的开发语言,Object-C基于C语言的,增加面向对象的相关特性。你可以认为Object-C就是另一个版本的C++,也就是它采用了与C++不同的语法,但也实现了面向对象。

NextStep是一个使用Object-C语言编写的功能强大的工具包,里面有大量的类库、结构体等,被苹果收购之后,更名为Cocoa,但是苹果并未更改NextStep中的类库名称,因此你会看到大量的以NS为前缀的类名、结构体、枚举等。在Object-C中使用前缀可以有效的防止名称冲突。

Cocoa框架由Foundation Kit、App Kit两部分组成,前者是基础工具库,是你必须首先要学会的,后者主要是UI库、高级对象等,我们这里只介绍Foundation Kit。

本文档使用Windows上的GNUStep作为Object-C的编译器,不支持Object-C 2.0的相关新特性,但基本完全支持Cocoa的Foundation Kit、App Kit工具库。

的安装::

1.GNUStep的安装

首先前往网址https://www.doczj.com/doc/3e2258174.html,/experience/Windows.html,下载文件:

然后按照下面的顺序安装这四个文件到同一个目录(例如:C:\GNUstep):

(1.)gnustep-msys-system-xxx.exe

(2.)gnustep-core-xxx.exe

(3.)gnustep-devel-xxx.exe

(4.)gnustep-cairo-xxx.exe

安装完成后,进入开始---程序---GNUStep---Shell,你会看到一个在Windows上打开的命令行窗口,你可以在其中使用Linux的Shell命令cd、ls、rm等进行操作。启动Shell之后,它会在GNUStep的目录中建一个/home/xxx/的文件夹,xxx为你当前登陆Windows系统的用户名称,Shell默认进入的就是这个目录,也就是Linux上的cd ~。

你可以在Shell中使用vi命令创建Object-C的源文件,但是推荐的方式是使用UltraEdit等编辑器编辑Object-C的源文件,然后在Shell中编译、运行。

GNUStep使用GCC编译器,编译Object-C的命令:

gcc -o hello.exe hello.m

-I/GNUstep/System/Library/Headers

-fconstant-string-class=NSConstantString

-L/GNUstep/System/Library/Libraries

-lobjc -lgnustep-base

(1.)红色部分为编译生成的可运行文件,蓝色部分为要编译的源文件,可以有多个,使用空格分隔。

(2.) 参数-I表示头文件查找的路径,-L表示库文件查找路径,-l表示需要链接的库文件,-fconstant-string-class=NSConstantString主要是指定常量字符串所使用的class。

类定义::

2.类定义

我们定义一个类,这个类完成的功能是使用两个int类型的数字组成一个分数。在Object-C 中必须首先定义一个接口,该接口用于描述这个类的组成,包含成员变量、类变量、类方法、成员方法。接口文件的扩展名为h,也就是定义为C语言中的头文件。

Fraction.h

#import

static int t=0;

@interface Fraction: NSObject{

int numerator;//分子

@public int denominator;//分母

}

-(void) setNumerator: (int) numerator;//numerator的setter方法

-(void) setDenominator: (int) denominator;//denominator的setter方法

-(void) setNumerator: (int) numerator andDenominator: (int) denominator;

//一个同时设置两个成员变量的快捷方法

-(int) numerator;//numerator的getter方法

-(int) denominator;//denominator的getter方法

-(void) print;

+(void) t;

@end

一个Object-C中的接口就是C语言中的一个header文件,这个文件结构如下所示:

#import Header

static 类型变量名;

@interface 接口名: 父类名称{

访问修饰符类型变量名;

… …

}

-(返回值类型) 方法名: (参数类型) 参数名标签1: (参数类型) 参数名… …

+(返回值类型) 方法名: (参数类型) 参数名标签1: (参数类型) 参数名… …

@end

我们来逐行看一下上面的内容:

(1.)这里与C语言不同的是导入头文件使用的是import,而不是include。另外与C语言一样

的地方是如果你想从当前目录查找Header文件,找不到就到系统的头文件库中查找,请使用#import “Header文件”,如果你只想从系统的头文件库中查找,请使用#import 。Foundation/Foundation.h包含了Foundation Kit中的所有的头文件定义,GNUStep的Object-C的Foundation头文件在

\GNUStep安装目录\GNUstep\System\Library\Headers\Foundation文件夹。

GNUStep的Object-C的AppKit头文件在

\GNUStep安装目录\GNUstep\System\Library\Headers\ AppKit文件夹。

(2.)static标识的类变量定义在接口的外面,类变量只能本类访问,除非提供类方法给外部

访问这个类变量。

(3.)Object-C中的@+指令表示C语言之外的Object-C的衍生语法,因此@interface表示定义

了一个接口,接口名称之后紧跟了一个冒号,冒号后是父类的名字,Object-C中的顶级父类是NSObject。

(4.)接口定义之后紧接着一对{ },其中定义了成员变量,所谓的成员变量就相当于JAVA中的

实例变量,从属于类的对象。Object-C中的成员变量使用@public、@protected、@private 作为访问修饰符,默认是@protected。这里你要知道的是Object-C中只有成员变量有访问修饰符,类变量、类方法、成员方法是没有访问修饰符的,所有的方法都是public的,所有的类变量都是私有的。

(5.)以-开头的方法为成员方法,以+开头的方法为类方法,方法中的类型描述(返回值类型、

参数类型)都必须使用( )包围。如果方法有多个参数,每个参数都有一个标签名(可以省略,但不建议这样做),每个标签名之后使用冒号与参数描述分隔。在有多个参数的方法中,实际的方法名称为方法名:标签名1:标签名2:… …,上面的拥有两个参数的方法的方法名为setNumerator:andDenominator:。与JAVA不同的是Object-C中的类方法只能类调用,如果你使用对象调用会报错,而JAVA仅仅是在编译期给出警告。

(6.)以@end表示接口定义结束。这是因为与JAVA不同的是JAVA的类型定义使用{ }包围,

而Object-C中的{ }只包围成员变量,因此必须有个结束标志,一般JAVA程序员经常会忘记写这个结束标记。

这里你要知道Object-C的@interface与JAVA的interface并不是一回事儿,后面你会看到Object-C中的@protocol与JAVA中的interface才是等同的。这里你只需要记住的是Object-C 中的@interface只是类的一个描述,因为@interface通常在独立的h文件中,你可以把它类比成C语言中的函数原型,也就是在Object-C里应该叫做类的原型。通过这个原型,编译器可以知道具体实现类有哪些功能。

上面的接口中的方法很简单,主要就是成员变量的setter、getter方法,这与JAVA没有什么不同的。但是你会发现getter方法没有以get作为方法名称前缀,这是因为get开头的方法在Object-C中有着特殊的含义,这在后面将会看到。

下面我们编写实现类,Object-C的类文件使用扩展名m。

Fraction.m

#import "Fraction.h"

@implementation Fraction

-(void) setNumerator: (int) n{

numerator=n;

}

-(void) setDenominator: (int) d{

denominator=d;

}

-(void) setNumerator: (int) n andDenominator: (int) d{

numerator=n;

denominator=d;

}

-(int) numerator{

return numerator;

}

-(int) denominator{

return denominator;

}

-(void) print{

printf("%d/%d\n",numerator,denominator);

}

-(void) m{

printf("-m:The class variable t is %d\n",++t);

}

+(void) t{

printf("+t:The class variable t is %d\n",++t);

}

@end

因为我们将Fraction.m与Fraction.h放在一个文件夹下面,所以#import使用了” ”,这个类的任务就是实现接口中的方法,因此与接口的结构不同的地方就是,你不能在这里定义变量,@interface换成了@implementation,其余就没有什么特别的了。你不必在这里实现@interface 中的全部方法,这不会导致错误。这里有个-(void) m方法比较特别,我们并没有在@interface 中声明,那么这个方法可以调用吗?因为Object-C是动态语言,即便是@interface中没有定义的方法,依然可以被调用。

另外,你需要注意的是setter方法与接口中不同的是参数名缩写成了n、d,这是因为在方法中,本地变量(参数、方法中定义的变量)在名称冲突的情况下,会隐藏成员变量,因此导致numerator=numerator变成了无意义的操作。当然你可以使用后面提到的self关键字,写成self->numerator=numerator,也就是JAVA中的常用的this.x=x的写法。

下面我们编写调用代码,因为Object-C基于C语言,所以程序的入口依然是main函数。这里注意#import的是h,不是m。

main.m

#import "Fraction.h"

int main(int argc,const char *argv[]){

Fraction *frac=[[Fraction alloc] init];

[frac setNumerator: 3 andDenominator: 5];

[frac print];

printf("The denominator of Fraction is %d\n",frac->denominator);

[Fraction t];//调用类方法

[frac m];

[frac release];

return 0;

}

(1.)第一行我们创建了Fraction的实例(对象),Object-C中实例只能使用指针作为变量,而

不能使用值,所以你看到了*frac,而不是frac,这与JAVA是一致的,JAVA中的指向实例的变量(JAVA中叫做引用)也是指针,只不过JAVA中没有指针的概念,所以你没有看到*。至于等号右侧的创建实例的代码,你可以在下面看到,这里先不用理会。(2.)第二行代码调用同时设置两个变量的方法,我们看到Object-C的调用方法的语法格式为

[类或者实例的指针方法名: 参数1 标签1: 参数2… …]。这种调用格式被称为中缀语法,初次看起来有点儿怪,但实际这样更加有效。举个例子,你接手了一个离职的人程序,其中的JAVA程序调用了一个有五个甚至更多的参数的方法,但是你手里没有这个方法的API,那么你很难猜得出来这五个参数到底都干什么用的,但是Object-C调用的时候,每个参数前面都必须有方法的标签名,这样你便能很容易的从标签名看出这个参数是什么意思。

成员变量的语法访问实例的变量,但一般我

对象->成员变量

(3.)第四行在C的printf()函数中使用了对象

们不推荐这么做,而是使用getter方法。这里你不能访问numerator变量,因为它是@protected的,只能本类、子类直接访问。

(4.)第五行我们调用了类方法t,你也可以换成这样的写法:

[[Fraction class] t];

或者

Class clazz=[Fraction class];

[clazz t];

class方法是一个类方法,来自于NSObject,相当于JAVA中的getClass()方法,也就是获取这个类的Class对象,clazz前面没有*。另外这种嵌套调用的方式,你也要习惯,这就和JAVA中的A.b().c()没有什么区别。

(5.)第六行我们调用了m方法,这个方法你会发现并没有在@interface中声明,这里依然调

用了,只是在编译的时候收到一个警告。这就是前面所有的Object-C是动态语言的原因。

但是一般情况下,你都会给别人提供h文件,所以你在m文件中写的h文件中没有的方法,别人也是不会知道的,这个方法相当于变相的私有化了。

(6.)第七行我们释放了frac实例在第一行alloc所申请的内存空间,Object-C的内存管理后面

会看到。另外,你会发现Fraction.h中没有定义alloc、init、release方法,但是我们上面调用了,很显然,这些方法来自于父类NSObject。

编译、运行上面的程序,你会看到Shell窗口输出如下内容:

中的布尔类型::

3.Object-C中的布尔类型

早期的C语言中是没有布尔类型的(C99增加了布尔类型),Object-C中增加BOOL类型来表示YES、NO,注意不是TRUE、FALSE。BOOL使用了一个8位(一个字节)的整数进行表示,8位全0就是NO。

我们知道C语言中非0值即为逻辑真,因此常常会有int i=5;while(i){… …}的写法。在Object-C 中一定要注意慎用C语言中的这种数字与逻辑真假混合对待的做法去操作BOOL类型变量。例如:

BOOL bi=8960;

if(bi==YES){

printf("YES");

}

这里会输出YES吗?不会的。为什么呢?8960是非0值,它不是逻辑真吗?还记得上面说过BOOL是一个8位的整数吗?因为8960用二进制表示是大于8位的,也就是说高位无效,只保留8960的低八位,8960的低八位恰好全都是0,因此bi就是NO了。因此在Object-C 中一定要注意这个问题,非零值未必是BOOL的YES,但是0一定是NO。

所以有C语言编程经验的,最好不要把BOOL与整数掺合在一起作为布尔类型的判断,可能C语言的开发者认为直接用数字作为布尔值进行判断在写法上更为简洁。

4.Object-C中的null:

Object-C中的对象使用nil表示null,但是它与null是有区别的,如果你向null发送消息(使用null调用方法)会得到运行时错误,这在JAVA中司空见惯的空指针异常就已经知道了。但是nil是可以回应消息(respond to message),因此你不必再为空指针而烦恼。

混合编写::

5.与C混合编写

我们看一段代码:

BOOL differentInt(int m , int n){

if(m!=n)

return YES;

else

return NO;

}

NSString *boolString(BOOL yn){

if(yn==YES){

return @"YES";

}

else{

return @"No";

}

}

int main(int argc,const char *argv[]){

NSLog(boolString(differentInt(5,3)));

return 0;

}

这里我们定义了函数differentInt()用于比较两个整数是否相等,boolString()函数用于将BOOL 类型转换为字符串。这两个函数的返回值都是Object-C中的类型,其中的BOOL不是对象类型,所以不使用指针,因此方法名称前面没有*,NSString是Object-C中的字符串对象,相当于JAVA中的String类型,@”… …”是一种NSString的字面值的表示方法,与JAVA中的”… …”可以直接表示字符串,而不必非得显示的用String来引用字符串是一样的。这里注意与Object-C的类型中的方法定义不同的是,函数的返回值如果是指针,*写在C语言的函数名称前面,而不是返回值的前面。

在main函数中我们使用了Object-C的函数NSLog(@”格式化字符串”,变量1,变量2,… …),这与C语言的printf(”格式化字符串”,变量1,变量2,… …)很相似,不过它会像JAVA中的LOG4J 一样,在输出语句之前增加日期戳、运行的类名、自动追加换行符\n等信息。

你可能又会问Object-C不都是对象吗?怎么还出来个NSLog()的函数呢?函数不是C语言面向过程编程的东西吗?其实Cocoa中有很多的东西都不是对象,而是C语言的函数、结构体等。例如:

struct NSRange{

NSUInteger location;

NSUInteger length;

}

结构体NSRang表示一个范围,location是范围的起始点,length是范围的长度。

struct NSRect{

NSPoint point;

NSSize size;

}

结构体NSRect表示一个矩形,point是左顶点的坐标,size是长宽。

struct NSPoint{

float x;

float y;

}

struct NSSzie{

float width;

float height;

}

NSRange常用来做字符串处理。NSRect常用来做图形处理,譬如:动画中不断的重新绘制矩形等。你很容易知道这是个频繁操作的处理过程,也就是矩形要不断绘制、擦除。假如NSRect 是一个Object-C类型,由于类实例化对象要在堆内存中动态分配存储空间,这是个很消耗资源的操作,而动画又是频率较高的操作,反复的创建、销毁对象,效率将会极其低下。所以Cocoa这里将NSRect定义为C语言的结构体就大大提高了运行效率。相比较Android平台,有人说做游戏纯靠JAVA是不行的,JAVA最多就是画画UI和做些简单的应用,因为JAVA不具备和C语言混合编程的能力,事事都要借助对象,所以必然要引入C去编写Android的*.SO 的图形引擎等,以提高处理能力。

对象的初始化::

6.对象的初始化

JAVA的对象创建只有一个过程,就是调用构造方法,但是Object-C分为两个步骤:分配内存、初始化,如上面的例子中的如下语句:

Fraction *frac=[[Fraction alloc] init];

(1.)alloc是从NSObject继承而来的类方法,用于给对象分配存储空间,所有的成员变量在

此时对确定了自己的内存位置,并被赋初值,整数类型为0,浮点数为0.0,BOOL为NO,对象类型为nil,alloc方法返回对象的指针。

(2.)init是从NSObject继承而来的成员方法,这个方法是你在对象创建过程可以参与的方法,

因此你可以定制自己的init方法。Object-C对init方法没有特殊的要求,就是一个普通方法而已,只不过习惯以init作为方法前缀。一般init方法都返回当前类型的指针或者id类型。id类型在Object-C中是一个泛型对象,与前面所说的Class对象一样,不使用指针作为变量,id可以表示任意类型的Object-C对象。

下面我们定制Fraction的初始化方法。

在Fraction.h中增加如下两个方法原型:

-(id) init;

-(Fraction*) initWithNumerator: (int) numerator andDenominator: (int) denominator; Fraction.m的实现:

-(id) init{

self=[super init];

}

-(Fraction*) initWithNumerator: (int) n andDenominator: (int) d{

self=[self init];

if(self){

[self setNumerator: n andDenominator: d];

}

return self;

}

(1.)第一个方法我们覆盖了NSObject中的init初始化方法,返回值id你也可以写成Fraction*,

这里只是为了让你知道id可以代表任意类型。方法的实现中我们首先调用了父类的init 方法,使用了关键字super,这与JAVA没什么不同的。另外,你还看到了关键字self,它相当于JAVA中的this,用于指向当前实例的指针。但是奇怪的是我把[super init]的返回值赋给了self,这在JAVA中是没有的操作。因为Object-C是动态语言,所以init方法很可能会返回一个不是当前类型的返回值,也就是Fraction的init方法是可能返回另一个类型的(Object-C中的NSString的实现代码init方法返回的就是NSCFString)。因此为了保证程序可以正常工作,你需要把父类的init方法产生的返回值赋给self,让self指向父类init方法返回的对象,然后才能开始其它操作。

(2.)第二个方法首先调用了第一个方法,这就相当于JAVA中的策略模式,重载方法互相调

用,这没有什么特别的。需要知道的是首先判断了一下self是否为nil(if(slef)与if(self!=nil)是相同的),因为父类可能因为某些原因导致初始化异常。

你可以在main函数中使用新的init方法:

Fraction *frac=[[Fraction alloc] initWithNumerator :2 denominator :3];

方法::

7.Object-C的description方法

JAVA中的对象都有从Object中继承而来的String toString()方法,用于获取对象的字符串表示,Object-C中的这个方法的方法签名为:

-(NSString*) description;

由于这是NSObject中的成员方法,因此我们就不必在Fraction.h文件中声明它了,直接在Fraction.m中实现如下所示:

-(NSString*) description{

return @"I am a fraction!";

}

编写main函数访问:

int main(int argc,const char *argv[]){

Fraction *frac=[[Fraction alloc] initWithNumerator: 2 andDenominator: 3];

NSLog(@"%@",frac);

return 0;

}

这里我们看到NSLog输出对象用的格式化字符串是%@,这样description方法就会被调用。如果我们不实现自己的description,那么会调用NSObject的实现,输出对象的首地址。

的异常处理::

8.Object-C的异常处理

我们的Fraction忽略了一个问题,那就是没有对denominator为0的情况作处理,也就是分母不能为0。我们可以使用Object-C的异常机制对这个问题进行处理。

Object-C的异常都继承自NSException,当然NSException本身也继承自NSObject。DenominatorNotZeroException.h

#import

@interface DenominatorNotZeroException: NSException

@end

DenominatorNotZeroException.m

#import "DenominatorNotZeroException.h"

@implementation DenominatorNotZeroException

@end

我们定义了分母不能为0的异常,Object-C中的异常定义起来很简单,其实除了写了类名之外什么都没有写。

下面我们改写Fraction.m的如下两个setter方法:

-(void) setDenominator: (int) d{

if(d==0){

NSException *e=[DenominatorNotZeroException

exceptionWithName: @"DenominatorNotZeroException"

reason: @"The denominator is not 0!"

userInfo:nil];

@throw e;

}

denominator=d;

}

-(void) setNumerator: (int) n andDenominator: (int) d{

if(d==0){

NSException *e=[DenominatorNotZeroException

exceptionWithName: @"DenominatorNotZeroException"

reason: @"The denominator is not 0!"

userInfo:nil];

@throw e;

}

numerator=n;

denominator=d;

}

这两个方法中我们判断如果denominator为0,则抛出DenominatorNotZeroException,DenominatorNotZeroException的创建使用了父类NSException的类方法exceptionWithName:reason:userInfo:,前两个参数表示异常的名字、原因,参数类型为NSString,第三个参数为用户信息,暂不清楚做什么的,我们传递nil就可以了。异常定义完成后使用@throw抛出。

下面我们编写捕获异常的代码:

int main(int argc,const char *argv[]){

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];

@try{

Fraction *frac=[[Fraction alloc] initWithNumerator: 3 andDenominator: 0];

}@catch (DenominatorNotZeroException *dne){

printf("%s\n",[[dne reason] cString]);

}@catch (NSException *e){

printf("%s\n",[[e name] cString]);

}@finally{

printf("finally run!");

}

[pool release];

return 0;

}

这里的捕获代码基本与JAVA的意义相同,只不过是try、catch、finally前加@。另外,由于NSException的成员方法name、reason返回的是NSString,因此又接着调用了NSString

的成员方法cString,得到C的字符串类型char[],然后才能传递给C的函数printf()。

这里你还看到了一个NSAutoreleasePool,先不用理会它,因为不写它会报错,后面会做讲解。

但你会发现上面的程序无法在GNUStep中运行,提示不认识@throw,所以你只需要知道上面的写法就可以了,运行可以在Mac电脑上操作。

类型::

9.id类型

下面我们演示一下id类型是如何可以指向任意类型的实例的。我们定义一个复数类型Complex。

Complex.h

#import

@interface Complex: NSObject {

double real;//复数的实部

double imaginary;//复数的虚部

}

-(Complex*) initWithReal: (double) r andImaginary: (double) i;

-(void) setReal: (double) r;

-(void) setImaginary: (double) i;

-(void) setReal: (double) r andImaginary: (double) i;

-(double) real;

-(double) imaginary;

-(void) print;

@end

Complex.m

#import "Complex.h"

@implementation Complex

-(Complex*) initWithReal: (double) r andImaginary: (double) i{

self=[super init];

if(self){

[self setReal: r andImaginary: i];

}

return self;

}

-(void) setReal: (double) r{

real=r;

}

-(void) setImaginary: (double) i{

imaginary=i;

}

-(void) setReal: (double) r andImaginary: (double) i;{

real=r;

imaginary=i;

}

-(double) real{

return real;

}

-(double) imaginary{

return imaginary;

}

-(void) print{

printf( "%f + %fi", real, imaginary );//输出复数z=a+bi

}

@end

main.m

#import "Fraction.h"

#import "Complex.h"

int main(int argc,const char *argv[]){

Fraction *frac=[[Fraction alloc] initWithNumerator: 3 andDenominator: 5];

Complex *comp=[[Complex alloc] initWithReal: 1.5 andImaginary: 3.5];

id number=frac;

[number print];

number=comp;

[comp print];

[frac release];

[comp release];

return 0;

}

我们看到id类型number首先指向了frac实例,调用了它的print()方法,然后指向了comp 实例,调用了它的print()方法。所以id你可以把它理解为随便,也就是它表示任意的东西。

类的继承::

10.类的继承

下面我们以矩形、正方形的对象展示一下Object-C中的继承结构。

矩形MyRectangle.h

#import

@interface MyRectangle: NSObject{

int width;

int height;

}

-(MyRectangle*) initWithWidth: (int) weight andHeight: (int) height; -(void) setWidth: (int) width;

-(void) setHeight: (int) height;

-(int) width;

-(int) height;

-(void) area;//计算面积

@end

矩形MyRectangle.m

#import "MyRectangle.h"

@implementation MyRectangle

-(MyRectangle*) initWithWidth: (int) w andHeight: (int) h{

self=[super init];

if(self){

[self setWidth: w];

[self setHeight: h];

}

}

-(void) setWidth: (int) w{

width=w;

}

-(void) setHeight: (int) h{

height=h;

}

-(int) width{

return width;

}

-(int) height{

return height;

}

-(void) area{

printf("%d\n",width*height);

}

@end

正方形MySquare.h

#import "MyRectangle.h"

@interface MySquare: MyRectangle{

int size;

}

-(MySquare*) initWithSize: (int) size;

-(void) setSize: (int) size;

-(int) size;

@end

这里正方形的父类是MyRectangle。

正方形MySquare.m

#import "MySquare.h"

@implementation MySquare

-(MySquare*) initWithSize: (int) s{

self=[super init];

if(self){

[self setWidth: s];

[self setHeight: s];

//因为正方形的长宽相等,所以我们把正方形的边长赋给父类的长宽,以便复用计算面积的方法area()。

}

}

-(void) setSize: (int) s{

size=s;

}

-(int) size{

return size;

}

@end

main.m

#import "MySquare.h"

int main(int argc,const char *argv[]){

MyRectangle *rec=[[MyRectangle alloc] initWithWidth: 2 andHeight: 5];

[rec area];

MySquare *squa=[[MySquare alloc] initWithSize: 6];

[squa area];//使用父类的计算面积的方法

[rec release];

[squa release];

}

11.动态判定与选择器

动态判定与选择器::

第9节中我们使用了id这个泛型对象,假如别人传递给你一个id,你如何动态判断这个在运行时传递过来的对象到底有没有XXX()方法呢?因为id可以代表任意对象,你也不知道运行时传递的这个id里面到底有什么东西。其实NSObject中有一系列这样的方法用于动态判定,类似于JAVA的反射机制,但是Object-C的用起来更为简单。

-(BOOL) isMemberOfClass: (Class) clazz 用于判断对象是否是clazz类型的实例,但

不包含子类的实例。

-(BOOL) isKindOfClass: (Class) clazz用于判断对象是否是clazz类型的实例或

者clazz的子类的实例。

-(BOOL) respondsToSelector: (SEL) selector 用于判断类型或者对象是否能够回应某个方法,这个方法使用选择器表示。

+(BOOL) instancesRespondToSelector: (SEL) selector 用于判断类型所产生的实例是否能够回应某个方法,这个方法使用选择器表示。

- (id) performSelector: (SEL) selector 用于动态调用类型或者对象上的一个方

法。

上面的后三个方法中都涉及到了一个新类型选择器SEL,它用于表示Object-C的一个方法,我们知道在C语言中有函数指针指向一个函数,也就是Object-C的选择器就相当于C语言中的函数指针,只不过选择器只能表示Object-C类型中定义的方法。选择器使用@selector(方法名)的形式获取,例如:@selector(initWithWidth:andHeight:) 、@selector(alloc)。同时,SEL是在继Class、id之后第三个不需要在变量前使用*的类型。另外,注意上面的红色文字,你可以看到这两行的方法都是-开头的,也就是成员方法,但是为什么类也可以去掉用呢?其实是类的Class对象去掉用的,因为Class对象有着两个方法的回应能力。

我们以第10节的矩形、正方形的程序为基础,进行代码演示。

int main(int argc,const char *argv[]){

MyRectangle *rec=[[MyRectangle alloc] initWithWidth: 2 andHeight: 5];

[rec area];

MySquare *squa=[[MySquare alloc] initWithSize: 6];

[squa area];

//-(BOOL) isMemberOfClass: (Class) clazz 用于判断对象是否是clazz的实例,但不包含子类的实例。

if([squa isMemberOfClass: [MyRectangle class]]){

printf("squa isMemberOfClass MyRectangle\n");

}else{

printf("squa not isMemberOfClass MyRectangle\n");

}

if([squa isMemberOfClass: [MySquare class]]){

printf("squa isMemberOfClass MySquare\n");

}else{

printf("squa not isMemberOfClass MySquare\n");

}

printf("----------------------------------------------\n");

//-(BOOL) isKindOfClass: (Class) clazz 用于判断对象是否是clazz的实例或者参数的子类的实例。

if([squa isKindOfClass: [MyRectangle class]]){

printf("squa isKindOfClass MyRectangle\n");

}else{

printf("squa not isKindOfClass MyRectangle\n");

}

if([squa isKindOfClass: [MySquare class]]){

printf("squa isKindOfClass MySquare\n");

}else{

printf("squa not isKindOfClass MySquare\n");

}

printf("----------------------------------------------\n");

//-(BOOL) respondsToSelector: (SEL) selector 用于判断对象或者类型是否有能力回应指定的方法。

if([squa respondsToSelector: @selector(initWithSize:)]){

printf("squa respondsToSelector initWithSize:\n");

}else{

printf("squa not respondsToSelector initWithSize:\n");

}

if([MySquare respondsToSelector: @selector(alloc)]){

printf("MySquare respondsToSelector alloc\n");

}else{

printf("MySquare not respondsToSelector alloc\n");

}

if([rec respondsToSelector: @selector(initWithWidth:andHeight:)]){

printf("rec respondsToSelector initWithWidth:andHeight:\n");

}else{

printf("rec not respondsToSelector initWithWidth:andHeight:\n");

}

printf("----------------------------------------------\n");

//+(BOOL) instancesRespondToSelector: (SEL) selector 用于判断类产生的实例是否是由有能力回应指定的方法。

if([MySquare instancesRespondToSelector: @selector(initWithSize:)]){

printf("MySquare instancesRespondToSelector initWithSize:\n");

}else{

printf("MySquare not instancesRespondToSelector initWithSize:\n");

}

if([MySquare instancesRespondToSelector: @selector(alloc)]){

printf("MySquare instancesRespondToSelector alloc\n");

}else{

printf("MySquare not instancesRespondToSelector alloc\n");

}

printf("----------------------------------------------\n");

//-(id) performSelector: (SEL) selector 用于动态调用类或者对象上的一个方法。

id x_id=[rec performSelector: @selector(area)];

[MyRectangle performSelector: @selector(alloc)];

[rec release];

[squa release];

}

12.类别Category:

如果你想扩充一个类的功能,但又不想使用继承,你可以选择类别。

下面我们写一个Fraction的类别,为Fraction类增加计算两个分数的加减乘除的方法。

FractionMath.h

#import "Fraction.h"

@interface Fraction (Math1)

-(Fraction*) mul: (Fraction*) f;//乘法,就是传入一个Fraction作为参数,与当前的Fraction 进行计算

-(Fraction*) div: (Fraction*) f;//除法

@end

@interface Fraction (Math2)

-(Fraction*) add: (Fraction*) f;//加法

@end

其实类别就是在你想要扩展的@interface的名字后面加个( ),里面写上类别的名字,这个名字必须是唯一的,也就是说一个@interface只能有一个类别为XXX的Category。

FractionMath.m

#import "FractionMath.h"

@implementation Fraction (Math1)

-(Fraction*) mul: (Fraction*) f{

return [[Fraction alloc] initWithNumerator: numerator*[f numerator]

denominator: denominator*[f denominator]];

}

-(Fraction*) div: (Fraction*) f{

return [[Fraction alloc] initWithNumerator: numerator*[f denominator]

denominator: denominator*[f numerator]];

}

@end

@implementation Fraction (Math2)

-(Fraction*) add: (Fraction*) f{

return [[Fraction alloc] initWithNumerator:

numerator*[f denominator] + denominator*[f numerator]

denominator: denominator*[f denominator]];

}

@end

类别的实现类也就是类型名后后面加个( ),里面写上类别的名字,其他的没有什么不同的。上面唯一可能会让你头晕的就是加减乘除的实现代码,实际上就是嵌套调用,写成了一个语句而已。拿add的实现来说,就是创建要返回的计算结果Fraction的实例,然后依据分数相加要先通分的规则,结果的分子initWithNumber就是第一个分数的分子*第二个分数的分母,再加上第二个分数的分子*第一个分数的分母,分母denominator参数就是两个分数的分母相乘。

main.m

#import "FractionMath.h"

int main( int argc, const char *argv[] ) {

Fraction *frac1 = [[Fraction alloc] initWithNumerator: 1 denominator: 3];

Fraction *frac2 = [[Fraction alloc] initWithNumerator: 2 denominator: 5];

Fraction *frac3 = [frac1 mul: frac2];

[frac1 print];

printf( " * " );

[frac2 print];

printf( " = " );

[frac3 print];

printf( "\n" );

Fraction *frac5 = [frac1 add: frac2];

[frac1 print];

printf( " + " );

[frac2 print];

printf( " = " );

[frac5 print];

printf( "\n" );

[frac1 release];

[frac2 release];

[frac3 release];

[frac5 release];

return 0;

}

运行GCC之后,Shell窗口输出如下内容:

我们看到没有使用继承语法,就为Fraction添加了数学运算的方法。另外,利用一个类可以有多个类别的特性(上面的Math1、Math2),如果一个@interface有上百个方法,那么你可以让编写的@implementation什么都不实现,然后按照@interface中的各个方法的功能的不同,在不同的类别中实现不同的方法,这样可以防止一个@implementation实现全部的接口而显得臃肿。

那么类别与继承相比,有什么缺点吗?类别不可以声明新的成员变量,而且一旦你定义的方法与原始类中的方法名称相同,那么原始方法将被隐藏起来,因为不是继承结构,你不能在类别中的方法使用super激活原始类的同名方法。

类别还有一个功能,就是隐藏方法,我们在Fraction.m的最后增加如下的内容:

@interface Fraction (Math3)

-(Fraction*) sub: (Fraction*) f;//减法

@end

@implementation Fraction (Math3)

-(Fraction*) sub: (Fraction*) f{

return [[Fraction alloc] initWithNumerator:

numerator*[f denominator] - denominator*[f numerator]

denominator: denominator*[f denominator]];

}

@end

在.m文件中定义@interface?你没有看错,因为@interface一旦定义在.m文件中,它就不能以Header文件的形式被导入到其他的类了,也就是这样的@interface中定义的方法相当于被你给隐藏了,只能这个.m编译单元内看见。

此时如果你在main函数中调用sub做减法运算,会在编译器得到一个警告,但是实际上你还是能够访问到sub方法,因为Object-C是动态语言,只要运行期有这个方法,就能够调用。我们把@interface定义在.m文件中只能做到让别人不知道有这个方法,但是如果他有你的.m 文件的源码或者恰好猜到(这种撞大运的几率太低了)你有sub方法,还是可以调用的。

类别的应用比较广泛,譬如:第三方的Object-C库RegexKitLite就是对NSString、NSMutableString做的类别,为Object-C的字符类型增加了正则表达式的功能。

13.协议@protocol:

前面说过@interface相当于是Object-C的类的原型,与JAVA中的接口意义是不同的,Object-C 中的@protocol才是和JAVA中的接口等价的东西。例如:Object-C的继承也是单继承,只允许有一个父类,但是@protocol是允许多继承的(按照Object-C的说法叫做某类遵从了协议A、协议B,而不是继承),这些都与JAVA的接口一致。

Printing.h

@protocol Printing1

-(void) print1;

@end

@protocol Printing2

-(void) print2;

@end

@protocol Printing3

-(void) print3;

@end

Printing3 的意思是Printing3遵从(继承)Printing2,<>是遵从@protocol协议的语法。

Fraction.h

#import

#import "Printing.h"

@interface Fraction: NSObject {

int numerator;

int denominator;

}

-(Fraction*) initWithNumerator: (int) n denominator: (int) d;

-(void) setNumerator: (int) n;

-(void) setDenominator: (int) d;

-(int) numerator;

-(int) denominator;

高中英语语法系统全解【珍藏版】

高中英语语法系统全解 第一章动词时态 在英语中,不同时间发生的动作或存在的状态,要用不同的动词形式来表示,这就叫做动词的时态。一、一般时 一般时包括一般现在时、一般过去时、一般将来时和一般过去将来时。 A.一般现在时 1.一般现在时的构成 一般现在时主要用动词原形来表示。主语是第三人称单数时,动词后面要加-s 或-es。 They want good jobs. 他们想要好的工作。 The coat matches the dress. 外衣和裙子很相配。 This work does not satisfy me. 这项工作我不满意。 Do you understand? 你懂了吗? 2.一般现在时的用法 ①一般现在时的基本用法 a. 表示现在习惯性的动作或存在状态 He always takes a walk after supper. 晚饭后他总是散散步。 Everyone is in high spirits now. 现在大家都情绪高涨。 b. 表示客观事实或普遍真理 The sun rises in the east and sets in the west. 太阳从东方升起在西方落下。 Sound travels faster through water than it does through air. 声音在水中的传播速度要比在空气中快。

Time and tide wait for no man. 时间不等人。 c. 表示主语的特征、能力和状态 This cloth feels soft. 这布摸上去很软。 I love classical music. 我喜欢古典音乐。 The President still seems able to find time to go fishing. 看来总统仍能有时间去钓鱼。 d. 表示按计划或安排将要发生的动作 The meeting begins at 7:00. 会议七点钟开始。 We leave here at 8:00 sharp. 我们八点整离开这里。 e. 在时间、条件、让步状语从句中表示将来动作 When you come next time, bring me some magazines. 你下次来时,给我带几本杂志。 If time allows, we shall go there tomorrow. 如果时间允许的话,我们明天去那里。 Whether he agrees or not, I will stay at home. 不管他同意与否,我都会待在家里。 ②一般现在时的特殊用法 a. 用于新闻标题或图片说明中 China Declares Manned Spaceflight Successful 中国宣布载人航天飞行圆满成功 Laura Bush Arrives in Moscow 劳拉·布什抵达莫斯科 b. 用于体育运动、表演等实况报道中 Francis slips past, passes the ball to Yao Ming, who jumps, catches and shoots it into the basket.

新编英语语法教程(第6版)练习参考答案

新编英语语法教程(第6版)第21讲练习参考答案Ex. 21A was sorry to learn… will be sad to hear… would be very surprised to receive… is happy to have found… was afraid to go… was pleased to hear… am very anxious to meet you. were delighted to receive your telegram. were sensible to stay indoors. clerk was prompt to answer the call. rule is easy to remember. are reluctant to leave this neighbourhood. house is difficult to heat. you ready to leave would be foolish to go out in this weather. is quick to see the point. is very keen to get on. are proud to have him as a friend. was rude not to answer your letter. are happy to have you with us this evening. Ex. 21B decision to resign surprised all of us. showed no inclination to leave.

英语语法体系

英语知识点 一、词汇 二、听力 三、口语 四、写作 五、语法 英语基础语法体系 对于任何英语句子,要分析其结构,这样才能找到英语语言的规律。每种语言都有它的难点,汉语的难点在于汉语不是拼读语言,汉字很难写,而且有四种声调。其实,许多接触过多种外语的人都认为,英语的语法比法语、德语、俄语、日语等都简单,是最容易学的。著名语言学家乔姆斯基说过,语法是内生的、也就是随着语言的诞生而诞生的。因此,学习语法和学习语言是相辅相成的。一、英语动词的时态 (一)英汉两种语言在时态表达方式上的差异: 英语的词类与汉语的不同。汉语词类形态稳定,比如“书”这个字,“一本书”、“三本书”都一样,没有词形变化。英语就不同了,book, books仅从词形上就能知道是单数还是复数。 动词是英语中变化最多、最复杂的词类。有人说,学好英语就是学好动词,此言甚是。同一个动作或状态分别在不同时间发生或存在,表达这个动作或状态的动词就要用不同的形式,这就是时态。 (二)英语动词的形式: 英语的时态是通过动词的变化来体现的。因此,了解动词的形式及其变化规律非常重要。英语的实义动词有以下五种形式: (1)动词原形:动词原形在句子中形式不变。主要用于主语为非第三人称单数的 一般现在时,情态动词之后,或根据语法规定必须用动词原形的其他情况。 (2) 一般现在时第三人称单数形式(简称现单三):主要用于主语为第三人称单

数的一般现在时。 (3) 过去式:主要用于一般过去时。 (4) 现在分词:主要用于进行时态,或语法规定的其他情况。 (5) 过去分词:主要用于完成时态,或语法规定的其他情况。 动词过去式和过去分词,大多数是动词原形+ ed 构成,这是规则动词。规则动 于发现不规则中的规则,即某些字母组合的不规则动词有一定的规律。如:weep→wept, sleep→slept, sweep→swept 英语动词所表示的动作在以上每个时间段中分别有四种状态:一般、进行、完成和完成进行。因此我们便有了四四一十六个时态。

新编英语语法教程第六版练习参考答案

新编英语语法教程(第六版)第02讲练习参考答案 Ex. 2A 1. SVC Within the stricken area, not a single soul remained alive, and the city centre looked as if it had been razed by monster steam-roller. 2. SV The bomb exploded 1,000 ft. above the ground. 3. SVO On August 6, 1945, an American aircraft dropped a bomb on the Japanese town of Hiroshima. 4. SvoO Three days later, yet another bomb of the same kind gave the town of Nagasaki the same fatal blow. 5. SVOC The explosion made one and a half square miles of the city an expense of reddish rubble. 6. SV A Within the fraction of a second, the bomb changed from a metal cylinder into an immense mass of expanding gas, millions of degrees hot. 7. SVOA A tremendous blast of hot air whirled the debris of stone, concrete, metal, and wood over the ground.

新编英语语法教程

导论———语法层次 0.1 词素 1)自由词素 2)粘附词素 0.2 词 1)简单词、派生词、符合词 2)封闭词类和开放词类 0.3 词组 1)名词词组 2)动词词组 3)形容词词组 4)副词词组 5)介词词组 0.4分句 1)独立分句和从属分句 2)简单分句和复杂分句 3)主句和从句 4)限定分句、非限定性分句、无动词分句0.5 句子 1)完全句和不完全句 2)简单句、并列句、复杂句、并列复杂句 第1讲句子结构 1.1 主谓结构和句子分析 1)主语和谓语 2)句子分析 1.2 基本句型及其转换与扩大 1)基本句型 2)基本句型的转换与扩大 第2讲主谓一致(一) 2.1指导原则 1)语法一致 2)意义一致和就近原则 2.2 以-s 结尾的名词作主语的主谓一致问题1)以-s结尾的疾病名称和游戏名称 2)以-s结尾的学科名称 3)以-s结尾的地理名称 4)其他以-s结尾的名词 2.3 以集体名词作主语的主谓一致问题 1) 通常作复数的集体名词 2)通常作不可数名词的集体名词 3)既可作单数也可作复数的集体名词 4)a committee of 等+复数名词

第3讲主谓一致(二) 3.1 以并列结构作主语的主谓一致问题 1)由and/both... And 连接的并列主语 2)由or/nor/either...or 等连接的并列主语 3)主语+as much as 等 4)主语+as well as 等 3.2 以表示数量概念的名词词组作主语的主谓一直问题1)以表示确定数量的名词词组作主语 2) 以表示非确定数量的名词词组作主语 3.3 其他方面的主谓一致问题 1)以名词性分句作主语的主谓一致问题 2)以非限定分句作主语的主谓一致问题 3)关系分句中的主谓一致问题 4)分裂句中的主谓一致问题 5)存在句中的主谓一致问题 第4讲 4.1 名词分类和名词词组的句法功能 1)名词分类 2)名词词组的句法功能 4.2 名词的数 1)规则复数和不规则复数 2)集体名词、物质名词、抽象名词、专有名词的数4.3 单位词 1)一般表示个数的单位词 2)表示形状的单位词 3)表示容积的单位词 4)表示动作状态的单位词 5)表示成双、成对、成群的单位词 第5讲 5.1 名词属格的构成、意义和用法 1)名词属格的构成 2)名词属格的意义 3)名词属格的用法 5.2 独立属格和双重属格 1)独立属格 2)双重属格 第6讲限定词(一) 6.1限定词与三类名词的搭配关系 1)能与三类名词搭配的限定词 2)只能与单数名词搭配的限定词 3)只能与复数名词搭配的限定词

《新编英语语法教程》语法术语精编

《新编英语语法教程》主要章节语法术语Introduction: Grammatical Hierarchy (导论—语法层次) 2. Parts of speech (word class) 3. Phrases 词组 4. Clause 分句 5. Sentence 句子 1. Morpheme 词素 Free morpheme 自由词素 Bound morpheme 粘附词素 Allomorph 词素变体 Noun phrase Verb phrase Adjective phrase Adverb phrase Preposition phrase Conjunction

Lecture 1 Sentence Structure(L1)Sentence elements: S (subject) 主语V (predicate verb) 谓语动词 O (object) 宾语 C (complement) 补足语 A (Adverbial) 状语 1. Two ways of sentence analysis 1) SVO Sentence Clause NP VP NP Subject Predicate verb Object All the man have done their best. Sentence = Subject + Predicate (Predicate Verb + Object, Complement, Adverbial, etc.) ●句子由主语和谓语构成,进一步把谓语剖析为谓语动词、宾语、补语、状语等。 2) Subject + Predicate (= operator + predication) Sentence Clause Subject Predicate Operator Predication All the man have done their best. ●句子由主语和谓语构成,进一步把谓语剖析为操作词(operator)和述谓成分(predication)。 2. Basic clause types SVC, SV, SV A, SVO, SVOA, SVOC, SV oO Lecture 2 Subject-Verb Concord (L2-3) Guiding principles: Grammatical Concord Notional Concord Principle of Proximity 语法一致原则意义一致原则就近原则 Nominal clause Non-finite clause Relative clause Cleft sentence Existential clause 名词性分句非限定分句关系分句分裂句存在句Lecture 3 Noun and Noun Phrase(L4-5) 1. Classification of nouns

英语语法基本句子结构

英语语法基本句子结构 课程名称:大学英语语法 学院:电子信息与电气工程学院 学生姓名:王磊 学号:201102010054 专业班级:自动化2011级(1)班 指导教师:李国云 2013年 6 月8 日

英语语法基本句子结构 语法是对现成语言中规则的归纳和总结,以便学习者更快模仿掌握一门外语。所以语法知识很重要,你不能用汉语的语法规则来造英语的句子,那样懂英语的人读不懂,同样不懂英语的语法规则也绝对读不懂英语短文。 不同词类的单词,按照一定的语法规则组合在一起,能够表达一个完整意思的语言单位叫句子,一个句子由各种功能不同的部分组成,这些部分叫做句子成分。 一个句子一般由两部分组成:主语部分和谓语部分。根据各个句子成分在句子中所起得作用,可分为主语、谓语或谓语动词、宾语、表语、定语、补语、状语等。 主语 全句述说的对象,常由名词、代词、名词性短语或分句充当,一般置于句首。下面依次举例: Walls have ears. Football is my favorite. Three plus four equals seven. 谓语或谓语动词 说明主语的动作或状态,主要一般又实义动词或者系动词担任,助动词和情态动词加其他动词的适当形式充当,一般置于主语之后。 They should have finished their work. The chance may never come again.

注意:英语中最基本的原则就是:一句话,只能有一个谓语动词 宾语 宾语表示动作的对象,是动作的承受者。宾语一般放在及物动词之后。英语介词后也会跟宾语。可作宾语的有名词,代词,数词,动名词等,不定时式也可做及物动词的宾语。下面依次举例:She refused to read that terrible book. We haven’t seen her for a long time. He needs a new dictionary. 表语 表述主语的身份、状态、特征,常由名词、代词、形容词、副词、数词、不定式、动名词、介词短语或分句充当。置于联系动词之后。联系动词一般有be,become,turn,get,grow,seem.,appear,look,sound,smell,feel 等。 My father is a professor. The milk has turned sour. Everything here is dear to her. 定语 是修饰名词或代词的词,短语或从句。作定语的有名词,形容词,数词,分词机器短语,不定式及其短语,介词短语以及定语从句等。下面依次举例:

系统学习英语语法的好书

系统学习英语语法的好书 怎样学习英语语法怎样学习语法呢?下面拟从四个方面简要谈一谈:(1)练好基本句型。我国近年来的英语教学实践证明:在初学阶段,采用听说、学习基本句型的方法去学习英语语法,是行之有效的。句型学习是通过听说的方法去学习传统语法里最常用的语法项目(把 它们变为句型去操练)。句型训练实际上吸取了传统语法与结构语法 两派的长处。当前国内的英语广播(电视)教学,在入门阶段,多采 用句型教学法。所以自学者或者收听广播(收看电视)实行学习,或 者根据所选用的课本提供的句型用替换词实行替换练习。所学的句型 应该是由浅入深,由简到繁;讲求熟练掌握,不要贪多冒进。每学一 个项目,首先要把单项练习练熟,然后过渡到综合练习,最后则应做 到扩大使用。以定语从句这个项为例。把"I read a novel yesterday.和"It was extremely Interesting."这两个单句改为"The novel I read yesterday was extremely interesting."这就 是定语从句的单项练习。首先要反复实行替换练习。如把"I saw a man this morning."和"The man is my teacher."改为"The man I saw this morning is my teacher."把"I saw a film last night."和"The film was very amusing."改为"The film I saw last night was very amusing."这种练习虽然是枯燥的,却是重要 的基本功,务求把定语从句练到脱口而出的地步。这是第一步。第二 步是把定语从句放在一定的语言情景中去综合使用,实行一问一答。如:A:Did you enjoy the opera? A:The one we saw last night,of course. B:Yes,very much.第三步是扩大使用,也就是把定语从句和以 前学过的两三个项目放在一起去操练。A:Do you know who Edgar Snow was?(一般问句;名词从句) B:Yes,he was an American writer who interviewed Chairman Mao in Beijing.(定语从句)

英语语法句式简单句子结构(透彻分析)

LESSON ONE 句子的三种模式 导言本课的重点是掌握英语的三种基本句型,注意词性和词序,以及定语的位置,同时注意中英文表达上的相同和不相同的地方。三种基本句型虽然简单,但至关重要。掌握好它们,在今后的学习中有一通百通之效。 ▲主+系动词+表 注:*注意该结构中的名词,它们能被定语修饰。 1 这个人是一个老师。The man is a teacher. 主语系表语主语系表语(名词) 2 他(是)很忙。He is busy. 主语系表语主语系表语(形容词) ▲注意中文中的系动词经常被省略,而英文中绝不能省。

3 她(是)在教室里。She is in the classroom. 主语系表语主语系表语(介词短语) ▲定语只修饰名词,不破坏句子的基本结构。通常 由形容词和介词短语充当,形容词放在所修饰的名 词之前,而介词短语放在所修饰的名词之后,请注 意英语与汉语词序的不同。看懂中文的定语是翻译 好定语的关键。 介词短语 ---英国法学家波洛克 介词短语 Happiness is a station -----------Pollock, British jurist 形容词介词短语 5

形容词介词短语 man is a teacher 介词短语形容词 6.教室里。 形容词介词短语 The teacher is handsome. My book is 表语(介词短语)定语(介词短语) She is

介词短语即可以做表语也可以做定语,虽然它们词性相同,但由于词序不同,它们所起到的作用也不同,当在is的后面是表语,跟在名词的后面它就起到定语的作用。 课堂练习 1 1是 2不是我的。 3.我的家乡hometown 峡谷valley里。 4那个贼 面behind。 1. 是 is 2钱不是我的。

英语语法系统精选文档

英语语法系统精选文档 TTMS system office room 【TTMS16H-TTMS2A-TTMS8Q8-

索引目录 高中英语语法 第1章动词时态 第2章被动语态 第3章虚拟语气第4章情态动词第5章动词不定式第6章动词的ing形式第7章过去分 词第8章独立主格结构第9章名词性从 句第10章定语从句 第11章状语从句

第一章动词时态(一) 在英语中,不同时间发生的动作或存在的状态,要用不同的动词形式来表示,这就叫做动词的时态。 一、一般时 一般时包括一般现在时、一般过去时、一般将来时和一般过去将来时。 A.一般现在时 1.一般现在时的构成 一般现在时主要用动词原形来表示。主语是第三人称单数时,动词后面要加-s或-es。 They want good jobs. 他们想要好的工作。 The coat matches the dress. 外衣和裙子很相配。 This work does not satisfy me. 这项工作我不满意。 Do you understand 你懂了吗 2.一般现在时的用法 ①一般现在时的基本用法 a. 表示现在习惯性的动作或存在状态 He always takes a walk after supper. 晚饭后他总是散散步。 Everyone is in high spirits now. 现在大家都情绪高涨。 b. 表示客观事实或普遍真理

The sun rises in the east and sets in the west. 太阳从东方升起在西方落下。 Sound travels faster through water than it does through air. 声音在水中的传播速度要比在空气中快。 Time and tide wait for no man. 时间不等人。 c. 表示主语的特征、能力和状态 This cloth feels soft. 这布摸上去很软。 I love classical music. 我喜欢古典音乐。 The President still seems able to find time to go fishing. 看来总统仍能有时间去钓鱼。 d. 表示按计划或安排将要发生的动作 The meeting begins at 7:00. 会议七点钟开始。 We leave here at 8:00 sharp. 我们八点整离开这里。 e. 在时间、条件、让步状语从句中表示将来动作 When you come next time, bring me some magazines. 你下次来时,给我带几本杂志。 If time allows, we shall go there tomorrow. 如果时间允许的话,我们明天去那里。 Whether he agrees or not, I will stay at home. 不管他同意与否,我都会待在家里。 ②一般现在时的特殊用法 a. 用于新闻标题或图片说明中 China Declares Manned Spaceflight Successful

新编英语语法教程(第6版)练习参考答案

新编英语语法教程(第6版)第21讲练习参考答案 Ex. 21A 1.I was sorry to learn… 2.You will be sad to hear… 3.They would be very surprised to receive… 4.She is happy to have found… 5.I was afraid to go… 6.Bob was pleased to hear… 7.I am very anxious to meet you. 8.We were delighted to receive your telegram. 9.You were sensible to stay indoors. 10.The clerk was prompt to answer the call. 11.This rule is easy to remember. 12.We are reluctant to leave this neighbourhood. 13.Our house is difficult to heat. 14.Are you ready to leave? 15.You would be foolish to go out in this weather. 16.John is quick to see the point. 17.He is very keen to get on. 18.We are proud to have him as a friend. 19.I was rude not to answer your letter. 20.We are happy to have you with us this evening. Ex. 21B 1.His decision to resign surprised all of us. 2.He showed no inclination to leave. 3.Her resolution never to marry baffled all offers of love. 4.The City Council approved the proposal to build a new dam on the river. 5.Their readiness to accept the peace arrangement really surprised the diplomatic world. 6.He refused the invitation to write another article on the subject. 7.The people of a country should have the freedom to choose their own social system. 8.There is no need for you to start so early. 9.I am not under the obligation to render him any financial support. 10.They have the ability to wage biological warfare. 11.He is not a man to be frightened by the threat of war. 12.There are plans to be made at once. 13.This is a day never to be forgotten. 14.Give me the names of the people to contact. 15.The next train to arrive is from Edinburgh. 16.The last problem to be considered at our next meeting is how to invest the money. 17.Was Cortes the first European ever to see the Pacific Ocean?

新课标高中英语语法系统全解状语从句(一)

第11章状语从句(一) 在复合句中修饰主句或主句中的某一成分的从句叫状语从句。状语从句通常由从属连词或起连词作用的词组引导,有时甚至不需要连词直接和主句连接起来。状语从句根据它表达的意思不同,可分为时间、地点、原因、目的、结果、条件、方式、比较、让步等九类。 一、时间状语从句 时间状语从句是表示时间关系的从句。可以引导时间状语从句的连词很多,根据意义和主从句之间的时间关系,通常可分为以下几种情况: A.when, while, as, whenever when, while, as表示主句谓语作和从句的谓语动作同时发生或几乎同时发生。 1.when ①when表示点时间时,从句中用短暂性动词;表示段时间时,用持续性动词。 When I got home, my family were already having dinner. 我到家的时候,全家已在吃晚饭。 (when表示点时间) When they were still talking and laughing, the teacher came in. 当他们还在说笑的时候,老师进来了。(when表示段时间) He waved ahello when he saw her. 当他看见她的时候,就挥手打了个招呼。(when表示点时间) When you think you know nothing, you begin to know something. 当你认为自己一无所知的时候,就开始知道一些事情了。(when表示段时间) 注意: 当when意思是正当……时候(and at that moment)时,when只能跟在前一分句之后。 He was about to go to bed when the doorbel rang. 他正要上床,忽然门铃响了。 They were watching the World Cup when suddenly the lights went out. 他们正看着世界杯比赛,突然灯灭了。 They had just arrived home when it began to rain. 他们刚到家,天就开始下雨了。 ②有时when表示虽然,尽管的含义,相当于although或since。 He walks when he might take a taxi. 尽管可以打的,但他还是步行。 How can you hope for mercy yourself when you show none 既然你不宽恕别人,你自己又怎能希望得到别人的宽恕呢? 2.while ①while通常表示一段时间,从句中宜用持续性动词作谓语。

新编英语语法教程第6版-语法6-9讲-答案

新编英语语法教程第06讲练习参考答案 Ex. 6A (4A) 1. description 2. arrangement 3. attendance 4. peculiarity 5. expectation 6. argument 7. dependence 8. originality 9. exaggeration 10. measurement 11. purity 12. persistence 13. extension 14. statement 15. generosity 16. entrance 17. loneliness 18. forgetfulness 19. happiness 20. seriousness Ex. 6B (6E) 1. How much work have you done this morning? 2. To dig a tunnel will need a great amount of labour. 3. He’s done the least work. 4. There are several methods of approaching this problem. 5. I know little French. 6. There must be less empty talk but more practical work. 7. Were there many people at the reception? 8. May I have a few words with you? 9. There were fewer people today at the exhibition than yesterday. 10. Harry made the fewest mistakes. 11. You’ve lear nt more poetry and done more exercises than I have. 12. Jack’s done the most work and made the most mistakes. 13. He’s done a lot of work and made a lot of mistakes. 14. A millionaire has lots of money—and lots of worries. 15. Anna has enough worries b ecause she hasn’t got enough money. 16. The telephone rang every few minutes. 17. We have been persisting in making the experiment all these last few cold days. 18. Both his next books on English linguistics will come out in 2006. 19. Soon we learned that we had to wait another three more weeks. 20. My brother spent $ 500 for a second-hand car, but I spent almost twice the amount for the same stuff. 新编英语语法教程第07讲练习参考答案 Ex. 7A 1.experience

最新高中英语语法大全-精讲教程18090

第一主题高中英语语法系统全解(一) 第1章动词时态2-4楼 第2章被动语态5-7 楼 第3章虚拟语气9-11 楼 第4章情态动词12-16楼 第5章动词不定式17-20 楼 第6章动词的ing形式21-24楼 第7章过去分词25-27楼 第8章独立主格结构28-30楼 第9章名词性从句31-33楼 第10章定语从句35-40楼 第11章状语从句(一)40-45楼 第11章状语从句(二) 第12章直接引语和间接引语 第13章倒装 第14章强调 第15章省略 第16章主谓一致 动词时态--一般时 第一章动词时态(一) 在英语中,不同时间发生的动作或存在的状态,要用不同的动词形式来表示,这就叫做动词的时态。 一、一般时 一般时包括一般现在时、一般过去时、一般将来时和一般过去将来时。

A.一般现在时 1.一般现在时的构成 一般现在时主要用动词原形来表示。主语是第三人称单数时,动词后面要加-s或-es。They want good jobs. 他们想要好的工作。 The coat matches the dress. 外衣和裙子很相配。 This work does not satisfy me. 这项工作我不满意。 Do you understand? 你懂了吗? 2.一般现在时的用法 ①一般现在时的基本用法 a. 表示现在习惯性的动作或存在状态 He always takes a walk after supper. 晚饭后他总是散散步。 Everyone is in high spirits now. 现在大家都情绪高涨。 b. 表示客观事实或普遍真理 The sun rises in the east and sets in the west. 太阳从东方升起在西方落下。 Sound travels faster through water than it does through air. 声音在水中的传播速度要比在空气中快。 Time and tide wait for no man. 时间不等人。 c. 表示主语的特征、能力和状态 This cloth feels soft. 这布摸上去很软。 I love classical music.

《新编英语语法教程》(第6版)答案

新编英语语法教程第15讲练习参考答案 Ex. 15A 1. will just be coming out 2. will be, will be wondering 3. will come 4. will be doing, will be working 5. will get, will still be, will be going, will ask 6. will be melting, will be 7. won’t start, will give 8. will tell 9. will be reading, will be ringing 10. will be cooking, will ring 11. am going to shampoo 12. is going to bake, will soon get 13. will see 14. am going to have 15. am going to bottle 16. Are you going to paint, am going to take 17. am going to ring 18. am going to start, Are you going to do, is going to help 19. will start, will get, will bake 20. am going to make, will burn

21. is arriving, Is he spending, is he catching, is spending, is giving, is attending 22. am going to dye, Are you going to do, are you going to have, am going to have 23. is going to rain 24. Are you doing, are coming, am going to show, Are you taking, am going to take 25. am going to send, am seeing 26. am moving, Are you going to have, am going to paint 27. am going to buy, is going to be 28. are you going to do, Are you going to sell, am going to learn, am having 29. am getting, are starting, is coming 30. is going, is having, is looking, is coming 31. will have finished, will be starting 32. will have planted 33. will have done, will be relaxing 34. will have done, will soon be leaving 35. will be trying, will have sent 36. will be living, will have spent 37. will be giving, will have given 38. will be coming, will have picked

初中英语语法结构图示

初中英语常用语法结构图示 一、词法: 单数 普通名词可数名词复数,复数变化规则 名词不规则名词复数形式 不可数名词及量的表示 专有名词: 人名、地名、国家名。大写,不加冠词 名词的格’s 多用于有生命的事物 of 多用于无生命的事物 人称代词:主格与宾格:人称代词的排序; 物主代词:形容词性物主代词;名词性物主代词 反身代词:构成;Own 的用法 that, this, these, those的用法; 指示代词such, so 的用法,the same as.的用法; so+(助)动词+主语与so+主语+(助)动词的区别。 代词one, another, the other, others, other等词的用法; one与it的区别; both,与all的区别; some, any的用法区别. 不定代词every与each的用法 either,neither,none的用法 -body,-one-thing-where与some, any, every,no的组合; any,many ,a few,few,much,alittle,little等词的用法。 疑问代词:who, what, which, whose, whom It的用法表示天气、气候、季节、时间、阴暗、距离、状况等做主语; 作形式主语与形式宾语; 定冠词的用法:特指 冠词:(a, an, the)不定冠词的用法:不特指 不用冠词的情况 作用:定语和表语及其位置. The+形容词=复数名词 用法 单音节词 形容词构成双音节词 多音节词 比较级与最高级不规则词 as+原级+as ;not as(so)+原级+ as 比较级+比较级 The+比较级+范围 The+比较级,the +比较级 序数词+最高级 副词与形容词的用法区别及相互转换 级别方面用法与形容词相同 already, yet; ago, before, since; now, just now; sometime. Some time, sometimes;频度副词; 副词几个副词的用法so that, so…that; too…to; too, either, everyday, every day, every other day;

相关主题
文本预览
相关文档 最新文档