一、继承
继承是面向对象编程技术的一个重要特性,它允许创建分等级层次的类,使用继承可以创建一个通用类,它定义了
一般特性,该类可以被更具体的类继承,每个具体的类都可以增加一些自己特有的东西。
继承具有如下特征:
(1)继承关系是传递的
(2)继承简化了人们对事物的认识和描述,能清晰体现相关类间的层次结构关系。
(3)继承提供了软件复用功能
(4)继承通过增强一致性来减少模块间的接口和界面,大大增加了程序的易维护性
(5)OC 仅支持单重继承
程序示例:先定义一个ClassA,它包含一个属性和一个方法,属性是一个整型的变量x,方法是用来给这个整型变量
设置一个值。ClassA是继承NSObiect类的。
ClassA.h代码:
#import <Foundateion/Foundation.h>
@interface ClassA : NSObject
{ int x; }
- (void) setX;
@end
ClassA,m代码:
#import "ClassA.h"
@implementation ClassA
-(void) setX
{ x = 10; }
@end
定一个ClassB用于继承ClassA,并定义一个新的方法叫做printX,用于将x的值打印出来
ClassB,h代码:
#import <Foundateion/Foundation.h>
#import "ClassA.h"
@interface ClassB : ClassA
- (void) printX;
@end
ClassB.m代码:
#import "ClassB.h"
@implementation ClassB
- (void) printX
{ NSLog(@"%i",x); }
@end
以下代码是对定义的类进行测试:
#import "ClassA.h"
#import "ClassB.h"
int main (int argc, const char * argv[ ])
{ NSAutoreleasePool * pool = [[NSAutoreleasePool allocl] init];
ClassB *classB = =[[classb alloc]init];
[classB setX];
[classB printX];
[classB release];
[pool drain];
return 0;
}
程序的输出结果为:10
二、方法重写
方法重写又称方法覆盖,若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数,则新方法将覆
盖原有的方法
将以上继承例子的代码稍作修改:
ClassA.h代码:
#import <Foundateion/Foundation.h>
@interface ClassA : NSObject
{ int x; }
- (void) setX;
@end
ClassA.m代码:
#import "ClassA.h"
@implementation ClassA
-(void) setX
{ x = 10; }
@end
在ClassB.h中定义一个方法也叫setX
#import <Foundateion/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;}
@end
同样在测试类中调用该方法
#import "ClassA.h"
#import "ClassB.h"
int main (int argc, const char * argv[ ])
{ NSAutoreleasePool * pool = [[NSAutoreleasePool allocl] init];
ClassB *classB = =[[classb alloc]init];
[classB setX];
[classB printX];
[classB release];
[pool drain];
return 0;
}
程序的输出结果为:11
三、方法重载
使用方法重载,可以在类中创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义,调用时,通过
传递给它们的不同个数和类型的参数来决定具体使用哪个方法。
方法重载的规范:方法名一定要相同
方法的参数表必须不同,包括参数的类或个数,以此区分不同的方法体
方法的返回类型、修饰符可以相同,也可以不同
基于前面的例子,我们给ClassB类增加一个新方法来体会方法重载:
- (void) setX:(int)value;
ClassB.h代码:
#import <Foundateion/Foundation.h>
#import "ClassA.h"
@interface ClassB : ClassA
- (void) printX;
- (void) setX;
- (void) setX:(int)value;
@end
ClassB.m代码:
#import "ClassB.h"
@implementation ClassB
- (void) printX
{ NSLog(@"%i",x); }
- (void)setX
{ x = 11;}
- (void)setX:(int)value
{ x = value; }
@end
测试代码:
#import "ClassA.h"
#import "ClassB.h"
int main (int argc, const char * argv[ ])
{ NSAutoreleasePool * pool = [[NSAutoreleasePool allocl] init];
ClassB *classB = =[[classb alloc]init];
[classB setX];
[classB printX];
[classB setX:100];
[classB printX];
[classB release];
[pool drain];
return 0;
}
程序结果为:11 100
ClassB中有两个setX方法,一个是重写ClassA方法,另一个则是自己定义的。在测试类中调用setX方法,编译器
会根据是否输入一个参数,而动态选择setX方法。