大三上第3章继承_第1页
大三上第3章继承_第2页
大三上第3章继承_第3页
大三上第3章继承_第4页
大三上第3章继承_第5页
已阅读5页,还剩24页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二章类1本章提要2继承方法重写(覆盖)使用super抽象类动态方法调用(多态)访问控制Catergory(类别)3继承NSObject是大多数类的根类所以很多类在接口文件中这样申明@interface

ClassName

:

NSObjectOC和JAVA一样不支持多重继承,如果要实现多重继承使用@protocol继承语法@interfaceClassB

:

ClassA4方法重写若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数,则新方法将覆盖原有的方法5方法重写ClassA.h代码:#import

<Foundation/Foundation.h>@interface

ClassA

:

NSObject

{int

x;}-(void)

setX;@endClassA.m的代码:

#import

"ClassA.h"@implementation

ClassA-(void)setX{x

=

10;}@end6方法重写ClassB.h中定义一个方法也叫setX#import<Foundation/Foundation.h>#import"ClassA.h"@interface

ClassB

:ClassA-(void)

printX;-(void)

setX;@end在ClassB.m中添加这个方法的实现。#import"ClassB.h"@implementation

ClassB-(void)printX{NSLog(@"%i",x);}-(void)setX{x

=11;}@end7方法重写测试类中调用该方法。#import

"ClassA.h"#import

"ClassB.h"int

main

(int

argc,

const

char

*

argv[

])

{@autoreleasepool{ClassB

*classB

=

[

[

ClassB

alloc

]

init

];[classB

setX];[classB

printX];[classB

release];}return

0;}8方法重载重载:类中创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义OC

不是严格的函数重载方法名一定要相同方法的参数个数必须不同方法的返回类型、修饰符可以相同,也可以不同。方法重载910使用supersuper关键字表示父类可以使用super访问父类中被子类隐藏的或重写的方法例如:[super

setX]; //调用父类的setX方法11使用superClassA.h代码:#import

<Foundation/Foundation.h>@interface

ClassA

:

NSObject

{int

x;}-(void)

setX;@endClassA.m的代码:

#import

"ClassA.h"@implementation

ClassA-(void)setX{x

=

10;}@end12使用superClassB.h#import<Foundation/Foundation.h>#import"ClassA.h"@interface

ClassB

:ClassA-(void)

printX;-(void)

setX;@endClassB.m#import"ClassB.h"@implementation

ClassB-(void)printX{NSLog(@"%i",x);}-(void)setX{x

=11;[supersetX];}@end13使用super测试类中调用该方法。#import

"ClassA.h"#import

"ClassB.h"int

main

(int

argc,

const

char

*

argv[])

{@autoreleasepool{ClassB

*classB

=

[[ClassB

alloc]init];[classB

setX];[classB

printX];[classB

release];}return

0;}14抽象类抽象类不能被实例化,单独使用也没有任何意义,完全是为了被继承抽象类定义的目的:为了别的类能从它们那里继承,这些抽象的方法和属性能够被很多不同的子类使用,从而保证子类继承一个相同的定义15抽象类NSNumber

是一个关于数字的抽象类#import

<Foundation/NSObject.h>#import

<Foundation/NSAutoreleasePool.h>#import

<Foundation/NSValue.h>#import

<Foundation/NSString.h>int

main

(int

argc,

char

*argv[]){@autoreleasepool{NSNumber

*myNumber,

*floatNumber,

*intNumber;NSIntegermyInt;//

integer

valueintNumber

=

[NSNumber

numberWithInteger:

238];myInt

=

[intNumber

integerValue];NSLog

(@”%li”,

(long)

myInt);//

long

valuemyNumber

=

[NSNumber

numberWithLong:

0xbadcef];NSLog

(@”%lx”,

[myNumber

longValue]);//

float

valuefloatNumber

=

[NSNumber

numberWithFloat:

2.08];NSLog

(@”%g”,

[floatNumber

floatValue]);}}动态方法调用通过id数据类型实现,它可以用来存储任何类的对象,实现多态Test1.h的代码如下:

#import

<Cocoa/Cocoa.h>@interface

Test1

:

NSObject

{}-(void)

print;@endTest1.m的代码如下:

#import"Test1.h"@implementation

Test1-(void)print{NSLog(@"我是test1");}@end1617动态方法调用Test.h的代码如下:#import

<Cocoa/Cocoa.h>@interface

Test1

:

NSObject

{}-(void)

print;@endTest.m的代码如下:

#import"Test1.h"@implementation

Test1-(void)print{NSLog(@"我是test");}@end18动态方法调用ClassTest.m的代码如下:#import

<Foundation/Foundation.h>#import

"Test.h"#import

"Test1.h"int

main

(int

argc,

const

char

*

argv[])

{@autoreleasepool{id

idTest;Test

*test

=

[[Testalloc

]init

];Test1

*test1

=

[[Test1alloc

]

init

];idTest

=

test;[idTest

print];idTest

=test1;[idTest

print];[test

release];[test1

release];}return

0;}19访问控制@protected:用此指令修饰的实例变量可以被该类和任何子类定义的方法直接访问,这是默认的情况。@private:用此指令修饰的实例变量可被该类的方法直接访问,但是不能被子类中定义的方法直接访问。@public:用此指令修饰的实例变量可以被该类中的方法直接访问,也可以被其他类定义的方法直接访问,读者应该避免使用这个作用域。其他类应该使用getter/setter方法来访问或设置其他类上的实例变量,否则就破坏了面向对象的封装性。20访问控制ClassA.h:#import

<Foundation/Foundation.h>@interface

ClassA

:

NSObject

{@publicint

x;@protectedfloat

y;@privatedouble

z;}@endClassA.m的代码如下:

#import"ClassA.h"@implementation

ClassA@end21访问控制ClassB.h:#import

<Foundation/Foundation.h>#import

"ClassA.h"@interface

ClassB

:ClassA-(void)print;@endClassB.m:#import

"ClassB.h"@implementation

ClassB-(void)print{y=2.0f;

//y在ClassA中定义,属性为@protectedNSLog(@"%f",y);}@end22访问控制TestClass.m测试类,测试上面代码的正确性:

#import"ClassA.h"#import

"ClassB.h"int

main

(int

argc,

const

char

*

argv[])

{@autoreleasepool{ClassA

*classA

=[[ClassA

alloc]init];ClassB*classB

=[[ClassBalloc]init];classA->x=1;

//->表示获取x的值,不赞成使用,破坏封装性

NSLog(@"%i",classA->x);[classB

print];classA->z

=

3.0;NSLog(@"%e",classA->z);[classA

release];[classB

release];}return

0;}23Category(类别)作用:为已经存在的类增加方法,而不需要增加一个子类标准的语法格式如下:#import"类名.h"@interface

类名(类别名)//新方法的声明@end实现部分代码:#import"类名类别名.h"@implementation

类名(类别名)//新方法的实现@end24Category(类别)例如:在NSString上增加一个方法来判断它是否是一个URL#import

……@interface

NSString

(Utilities)(BOOL)isURL;@end实现:#import

"NSStringUtilities.h"@implementation

NSString

(Utilities)(BOOL)

isURL{if

(

[self

hasPrefix:@“http://”]

)//NSString自带方法,检查字符串是否以某字符串开头

return

YES;elsereturn

NO;}@end25Category(类别)调用:#import

<Foundation/Foundation.h>int

main

(int

argc,

const

char

*

argv[])

{@autoreleasepool{NSString

*string1

=

@"

";NSString

*string2

=

@"Pixar";if

([string1

isURL])

{NSLog(@"string1

is

a

URL");}else

{NSLog(@"string1

is

not

a

URL");}if

([string2

isURL])

{NSLog(@"string2

is

a

URL");}

else

{NSLog(@"string2

is

not

a

URL");}}return

0;26Category(类别)注意:category并不能为类声明新的实例变量,它只包含方法在类作用域中的所有实例变量(甚至@private

类型的),都能被这些category方法所访问。一个类可以添加多个category,但每个category名必须不同,而且每个category都必须声明并实现一套不同的方法category来修改一个类的时候,它对应用程序里的这个类的所有对象都起作用。跟子类不一样,category

不能增加成员变量。还可以用category

来重写类原先的存在的方法(不推荐)27@class

指令A类是引用类,B类是被引用类,通常引用一个类有两种办法:#import方式引入@class引入用法:class1.h:#import

<Foundation/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论