Objective-C之成魔之路【10-继承性】

重开发者的劳动成果,请勿转载

继承性是面向对象的重要概念之一, 子类能够继承父类的某些方法和成员变量。

作用域限定符为private的成员变量是不可以被继承的。

子类还可以重写父类的方法。

当然,这一切要从根类开始:

没有父类的类,位于类层次结构的最顶层,称为根(Root)类。

NSObject是层次结构的最顶端(也就是它上面没有任何类),因此称为根类。

如果使用术语,可以将类称为子类和父类。同样,也可以将类称为子类和超类。

需要注意的是,要在子类中直接使用实例变量,必须先在接口部分声明。

在实现部分声明和合成(synthesize)的实例变量是私有的,子类中并不能够直接访问,

需要明确定义或合成取值方法,才能访问实例变量的值。

继承的概念作用于整个继承链。

一定要理解以下事实:类的每个实例都拥有自己的实例变量,即使这些实例变量是继承来的。

找出正确的方法:

首先,检查该对象所属的类,以查看在该类中是否明确定义了一个具有指定名称的方法。

如果有,就使用这个方法。如果没有定义,就检查它的父类。

如果父类中有定义,就使用这个方法,否者,继续找寻。

直到找到根类也没有发现任何方法。

通过继承来扩展:添加新方法

继承通常用于扩展一个类。

@class指令:

@class XYPoint;

#import "XYPoint.h"

使用@class指令提高了效率,因为编译器不需要引入和处理整个XYPoint.h文件(虽然它很小),

只需要知道XYPoint是一个类名。

如果需要引用XYPoint类的方法(在实现部分中),@class指令是不够的,因为编译器需要更多的消息。

说的通俗点:只引用了类就用@class不然就用#import。

在默认情况下,合成的设值方法只是简单地复制对象指针,而不是对象本身。

你可以合成另一种设值方法,而不是制作对象的副本。

为了了解继承性, 我们看看这样的一个场景:

一位刚学习面向对象的小菜,自从当上了班长,他就有的忙了,因为录入档案,需要描述和处理个人信息,

于是他定义了类Person:

@interface Person: NSObject {

NSString* name;

int age;

NSDate birthDate;

}

-(NSString*) getInfo;

@end

新的校花School Beauty类:

一周以后, 小菜又遇到了新的需求, 他的几个表妹非要把各自学校的校花介绍给我他,烦恼呀!

需要描述和处理校花信息, 于是他又定义了一个新的类Beauty。

@interface Beauty:
NSObject {

NSString* name;

int age;

NSDate birthDate;

NSString* school;

}

-(NSString*) getInfo;

@end

小结

Beauty和Person两个类的结构太接近了,

后者只比前者多出一个属性school
, 却要重复定义其它所有的内容。

Objective-C提供了解决类似问题的机制, 那就是类的继承。

@interface Beauty:
Person {

NSString* school;

}

方法重写或者说是覆写方法:

不能通过继承删除或减少方法,但可以利用覆写来更改继承方法的定义。

新方法必须具有相同的返回类型,并且参数的数目与覆写的方法相同。

如果在不同的类中有名称相同的方法,则根据作为消息的接收者的类选择正确的方法。

为什么要创建子类?

有如下3个理由:

1)希望继承一个类的方法,也许加入一些新的方法和或实例变量。

2)希望创建一个类的特别的版本。

3)希望通过覆写一个或多个方法来改变类的默认行为。

抽象类:

有时,创建类只是为了更容易创建子类。

因此,这些类名为抽象(abstract)类,或等价地称为抽象超类(abstract superclasses)。

在该类中定义方法和实例变量,但不期望任何人从该类创建实例。

注意:

子类不能继承父类中作用域限定符为@private的成员变量。

子类可以重写父类的方法,及命名与父类同名的成员变量。

下面再通过一个矩形类和正方形类的实例说明方法重写问题:

Rectangle.h文件:

#import <Foundation/NSObject.h>

@interface Rectangle: NSObject {
    int width;
    int height;
}

-(Rectangle*) initWithWidth: (int) w height: (int) h;
-(void) setWidth: (int) w;
-(void) setHeight: (int) h;
-(void) setWidth: (int) w height: (int) h;
-(int) width;
-(int) height;
-(void) print;
@end

Rectangle.m文件:

#import "Rectangle.h"

@implementation Rectangle

-(Rectangle*) initWithWidth: (int) w height: (int) h {
    self = [super init];

    if ( self ) {
        [self setWidth: w height: h];
    }

    return self;
}

-(void) setWidth: (int) w {
    width = w;
}

-(void) setHeight: (int) h {
    height = h;
}

-(void) setWidth: (int) w height: (int) h {
    width = w;
    height = h;
}

-(int) width {
    return width;
}

-(int) height {
    return  height;
}

-(void) print {
    NSLog(@"width = %i, height = %i", width, height );
}
@end

Square.h文件:

#import "Rectangle.h"

@interface Square: Rectangle
-(Square*) initWithSize: (int) s;
-(void) setSize: (int) s;
-(int) size;
@end

Square.m文件:

#import "Square.h"

@implementation Square
-(Square*) initWithSize: (int) s {
    self = [super init];

    if ( self ) {
        [self setSize: s];
    }

    return self;
}

-(void) setSize: (int) s {
    width = s;
    height = s;
}

-(int) size {
    return width;
}

-(void) setWidth: (int) w {
    [self setSize: w];
}

-(void) setHeight: (int) h {
    [self setSize: h];
}
@end

调试用的main函数:

#import <Foundation/Foundation.h>
#import "Square.h"
#import "Rectangle.h"

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

		Rectangle *rec = [[Rectangle alloc] initWithWidth: 10 height: 20];
    Square *sq = [[Square alloc] initWithSize: 15];

    NSLog(@"Rectangle: " );
    [rec print];

		NSLog(@"Square: " );
    [sq print];

    [sq setWidth: 20];
    NSLog(@"Square after change: " );
    [sq print];

    [rec release];
    [sq release];

    return 0;
}

运行结果:

Rectangle:

width = 10, height = 20

Square:

width = 15, height = 15

Square after change:

width = 20, height = 20

时间: 2024-10-16 04:30:28

Objective-C之成魔之路【10-继承性】的相关文章

Objective-C之成魔之路【1-序章】

重开发者的劳动成果,请勿转载 C语言首创于AT&T实验室, UNIX OS的发展促进了C语言的快速普及,UNIX OS几乎完全是由C语言编写的. Brad J.Cox在20世纪80年代早期设计了Objective-C语言,它以一种叫做SmallTalk-80的语言为基础. SmallTalk-80可以参考: http://zh.wikipedia.org/wiki/Smalltalk Objective-C在C语言的基础上加了一层,这意味着对C进行了扩展, 从而创造出一门新的程序设计语言,支持面

Objective-C之成魔之路【11-多态性、动态类型和动态绑定】

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 多态这个其它语言也有.动态类型有类似的,但不完全相同. 动态绑定别的语言也有类似,但没有objective-c用的这么多. 多态能够使来自不同类的对象定义相同名称的方法. 动态类型能使程序直到执行时才确定对象所属的类. 动态绑定则能使程序直到执行时才确定实际要调用的对象方法. 多态性是指在父类中定义的成员变量和

Objective-C之成魔之路【3-数据类型】

重开发者的劳动成果,请勿转载 数据类型. 运算符和表达式在任何的计算机语言中都比较重要的, 在面向对象的Objective-C语言中, 除了常规的基本类型, 还有对象类型等. 运算符和表达式完全遵守C语言规范. Objective-C数据类型可以分为:基本数据类型. 对象类型和id类型. 基本数据类型有: int. float. double和char类型. 对象类型就是类或协议所声明的指针类型, 例如: NSAutoreleasePool * pool, 其中NSAutoreleasePool

Objective-C之成魔之路【5-选择结构】

重开发者的劳动成果,请勿转载 Objective-C中的控制语句有以下几类: ? 分支语句: if-else, switch ? 循环语句: while, do-while, for ? 与程序转移有关的跳转语句: break, continue, goto 对于任何程序语言来说,有能力进行判断是一项基本特性. if-else语句 分支语句提供了一种控制机制, 使得程序的执行可以跳过某些语句不执行, 而转去执行特定的语句. 1. 条件语句 if-else 2. 多分支语句 switch 条件语句

Objective-C之成魔之路【15-Foundation框架】

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 概述 Mac OS X开发会使用 Cocoa框架, 它是一种支持应用程序提供丰富用户体验的框架, 它实际上由: Foundation和Application Kit(AppKit)和 Core Data框架组成. iOS开发, 会使用 Cocoa Touch框架, 它实际上由: Foundation.Core

Objective-C之成魔之路【4-运算符和表达式】

重开发者的劳动成果,请勿转载 运算符和表达式 运算符可以分成如下几种: ?算术运算符, +, ―, *, /, %, ++, ―― ?关系运算符, >, <, >=, <=, ==, != ?布尔逻辑运算符, ! , &&, || ?位运算符, &, | , ^, ~ , >>, << ?赋值运算符, +=, ―=, *=, /= ?条件运算符, ? : 短路与和短路或 布尔逻辑运算符中有两个比较特殊的运算符号, "&

Objective-C之成魔之路【6-循环结构】

重开发者的劳动成果,请勿转载 计算机的基本属性之一就是它能够重复执行一组语句. 循环语句的作用是反复执行一段代码, 直到满足终止循环的条件为止. Objective-C语言中提供的循环语句有: ? while语句 ? do-while语句 ? for语句 while语句, 它的语法形式如下, 其中"[] " 中的部分可以省略. [initialization] while (termination){ body; [iteration;] } 举例如下: 水仙花数是指一个 n 位数 (

Objective-C之成魔之路【9-类构造方法和成员变量作用域、以及变量】

重开发者的劳动成果,请勿转载 构造方法 出于初始化类中的成员变量的需要, 可以提供一个方法用于此目的, 这个方法就叫构造方法或构造方法(Constructor). 与C++和Java不同, Objective-C命名是没有限制的, 并且有返回值本身类型指针. 以音乐类举例: Song.h文件 @interface Song : NSObject { NSString *title; NSString *artist; long int duration; } //操作方法 - (void)sta

Objective-C之成魔之路【17-内存管理】

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 内存管理关心的是清理(回收)不用的内存,以便内存能够再次利用. 提供给Objective-C程序员的基本内存管理模型有以下三种: 1)自动垃圾收集.(iOS运行环境并不支持垃圾收集,在这个平台开发程序时没有这方面的选项,只能用在Mac OS X 程序上开发.这个机制挺恶心的,用mac电脑的人知道,当内存不足的时