面向对象编程--继承和复合

来源:互联网 发布:域名到期了备案 编辑:程序博客网 时间:2024/06/04 18:42

面向对象编程--继承和复合:

我们知道Objective-C是一种面向对象的编程语言,这与Java语言以及C++语言是一样的。虽然,它是C语言的拓展,但是却发现了面向对象思想的奇妙并引进使用面向对象的思想编程(应多编写面向对象程序),所以,在这里同样要引入两个很重要的面向对象的概念,即继承和复用。

继承:一般在创建一个新类的时候,通常需要根据它与现有类之间区别来定义。使用继承可以定义具有父类所有功能的新类,并且新类可以拥有父类所有的属性和行为,同时也可以定义自己专属的属性和行为,这就是类的继承,它从代码架构的角度提出了很好的解决方案。

复合:所谓的复合一般是与继承一起使用,也就是在一个对象当中引用另一个对象的策略,一般被引用的对象是作为引用对象的一部分而存在,这样对象的结构更加灵活多变。例如:可以使用复用来实现一个汽车模型的结构定义,一辆汽车有一个引擎,同时对应四个汽车轮胎(一般为四个轮胎,不排除其它可能)。

 

继承的语法:

这里以汽车的引擎声明为例来说明继承的语法格式,具体如下:

@interface Engine : NSObject

@end

冒号后面的标识符为需要继承的类。在Objective-C中,如果我们使用的是Cocoa框架,那么就必须继承NSObject基类,因为它提供了大量的有用功能。在某些编程语言,例如C++具有多继承性特点,也就是一个类可以直接从多个类继承而来;而我们熟悉的Java语言则是单继承机制的,就是一个类只能有一个父类或基类。如果我们尝试在Objective-C中使用多继承是行不通的,当然可以通过其他的方式来实现类多继承,例如:类别和协议(后面会总结)。

下面为继承的实现代码,具体如下:

@implementation Engine

- (NSString *) description

{

return (@"i am an engine!");

}

@end // engine

搞Java开发的程序员应该熟悉关键字implements,这里的implementation起到的作用与它是一样的。一个类有了声明,那么对应的就必须需要有实现来完成功能。

Super关键字

在Objective-C中,其提供了一种方法,允许我们重写方法的实现,以及调用父类中的方法实现方式。如果需要超类实现自身的功能,同时在之前和之后执行某些额外的工作时,这种实现机制就很有用了。为了调用继承的方法在父类中的实现,需要使用关键字Super来调用目标方法。具体如下:

@implementation Car

- (id) init

{

if(self == [super init]) {

engine = [Engine new];

tires[0] = [Tire new];

tires[1] = [Tire new];

tires[2] = [Tire new];

tires[3] = [Tire new];

}

return (self);

}

如上,这里我们使用关键字super调用超类中的init()方法来实现当程序运行时调用NSObject中的方法init()来初始化某些动作。

 

复合的使用

如同上面的介绍的概念,这里以汽车构成为例说明复合的使用,具体如下代码所示:

@interface Car:NSObject

{

Engine *engine;

Tire *tires[4];

}

我们知道现在的汽车是由一个引擎、四个轮胎所构成(将来可能有其他的搭配形式,呵呵)。所以,如上汽车的结构所示,一台汽车Car是由一个汽车的引擎Engine和四个汽车轮胎Tire所构成,这个恰好说明了复合的使用。

 

自定义NSLog()

日志是程序开发中必不可少的调试方式(也是推荐使用的方式)。那么在Objective-C中怎么会遗忘它那?这里使用的是关键字NSLog()来输出调试日志信息。我们可以自定义这个方法,以我们需要的格式输出日志信息。它的工作原理是这样的:需要记住,NSLog()使用了%@格式说明符来输出对象。NSLog()处理%@说明符的时候,会查询参数列表中对应的对象来得到这个对象的描述信息。也就是NSLog()给对象发送description消息,而后对象的description方法生成一个NSString类型的数据并返回。NSLog()就会获得这个返回值并在控制台输出的结果中包含这个字符串了。具体如下代码:

- (void) print

{

NSLog(@"%@",engine);

NSLog(@"%@",tires[0]);

NSLog(@"%@",tires[1]);

NSLog(@"%@",tires[2]);

NSLog(@"%@",tires[3]);

}

这个方法是定义在Car类中的,是用来打印显示汽车的引擎和轮胎的信息。

 

存取方法

在Java中,为每个使用的类编写属性的存取方式是很好的编程习惯。那么在Objective-C中也不会少了它。它的作用就是为当前的类提供直接操作自己的赋值和取值的便捷方法,使用起来比较方便,也可以让代码更加灵活。具体如下代码所示:

存取方法的声明:

@interface Car:NSObject

{

Engine *engine;

Tire *tires[4];

}

- (Engine *) engine;

- (void) setEngine:(Engine *) newEngine;

- (Tire *) tireAtIndex:(int) index;

- (void) setTire:(Tire *) tire atIndex:(int)index;

- (void) print;

@end // car

存取方法实现:

@implementation Car

- (id) init

{

if(self == [super init]) {

engine = [Engine new];

tires[0] = [Tire new];

tires[1] = [Tire new];

tires[2] = [Tire new];

tires[3] = [Tire new];

}

return (self);

}

- (Engine *) engine

{

return (engine);

}

- (void) setEngine:(Engine *) newEngine

{

engine = newEngine;

}

- (Tire *) tireAtIndex:(int)index

{

if(index<0 || index >3)

{

exit(1);

}

return (tires[index]);

}

- (void) setTire:(Tire *)tire atIndex:(int)index

{

if(index<0 || index >3)

{

exit(1);

}

tires[index] = tire;

}

- (void) print

{

NSLog(@"%@",engine);

NSLog(@"%@",tires[0]);

NSLog(@"%@",tires[1]);

NSLog(@"%@",tires[2]);

NSLog(@"%@",tires[3]);

}

@end // car

 

 

这篇文章主要介绍了面向对象中的继承和复用机制,以及存取方法的设定和使用。这里庆祝下,今天对Objective-C语言的了解又近了异步呵!

 

 

 

/**

*  技术交流群:179914858

*/

0 0
原创粉丝点击