Object C 继承
来源:互联网 发布:网络交友有哪些弊端 编辑:程序博客网 时间:2024/06/05 21:58
在OC 中有父类和子类的概念,没有父类(超类->super class)的类位于类层次结构的最顶层,成为根(root)类,OC中可以定义自己的根类,但不建议这么做。定义了一个新类,会从父类继承些属性。比如,父类的非私有变量和方法都会成为新类定义的一部分,子类可以直接访问这些方法和实例变量。
下面举个例子,首先定义一个类ClassA,再定义一个类ClassB:
#import <Foundation/Foundation.h>//ClassA的声明@interface ClassA : NSObject{ int x;}-(void) initVar;@end//ClassA 的实现@implementation ClassA-(void) initVar{ x = 100;}@end//声明ClassB@interface ClassB : ClassA-(void) printVar;@end@implementation ClassB-(void) printVar{ NSLog(@"x=%i",x);}@end
ClassA ,ClassB ,NSObject 几个类之间的关系如下图:
如上图: NSObject 是ClassA和ClassB的父类。由于ClassB是ClassA的子类,因此它继承了ClassA的共有实例变量和方法:
其实像alloc , init 方法在使用时都未定义过,使用的时候都是从NSObject类中继承过来的。
注意:1.类的每个对象都拥有自己的实例变量,即使这些实例变量是继承来的。
2.继承的概念是作用于整个继承链的。
1.通过继承添加新方法
(1)我们想写一个矩形的类, 同时写一个正方形类作为矩形的子类,下面为Recangle, Square的生命和实现代码:
#import <Foundation/Foundation.h>@interface Rectangle : NSObject@property int width, height;-(int) area;-(int) perimeter;@end
//Rectangle.m#import "Rectangle.h"@implementation Rectangle@synthesize width, height;-(void)setWidth:(int)w andHeight:(int)h{ width = w; height = h;}-(int)area{ return width * height;}-(int)perimeter{ return 2*(width + height);}@end
//Square.h#import <Foundation/Foundation.h>#import "Rectangle.h"@interface Square : Rectangle-(void) setSide: (int)s;-(int) side;@end
//Square.m#import "Square.h"@implementation Square: Rectangle-(void) setSide: (int)s{ [self setWidth: s andHeight: s];}-(int) side{ return self.width;}@end
#import <Foundation/Foundation.h>#import "Square.h"int main (){ @autoreleasepool { Square *mySquare = [[Square alloc] init]; [mySquare setSide:10]; NSLog(@"Square s = %i", [mySquare side]); NSLog(@"Area = %i, Perimeter = %i", [mySquare area], [mySquare perimeter]); } return 0;}square方法虽然是Rectangle类的子类,但是因为width是私有的,故需要通过继承Rectangle的set方法来或缺。这种定义square类的方式是OC中的基本技术,即扩展自己或其他人以前实现的类,使其适合自己的需求。
2.重写方法
前面提到过,不能通过继承删除或减少方法,但可以利用重写更继承方法的定义。所谓重写:即子类重现父类中的某个方法,覆盖父类以前的方法(方法的返回型和参数数目都要相同)。
下面的例子说明重写:
<span style="font-size:14px;">#import <Foundation/Foundation.h>//ClassA的声明@interface ClassA : NSObject{ int x;}-(void) initVar;@end//ClassA 的实现@implementation ClassA-(void) initVar{ x = 100;}@end//声明ClassB@interface ClassB : ClassA-(void) initVar;-(void) printVar;@end@implementation ClassB-(void) initVar{ x =200;}-(void) printVar{ NSLog(@"x=%i",x);}@endint main (){ @autoreleasepool { ClassB *b = [[ClassB alloc] init]; [b initVar]; [b printVar]; } return 0;}</span>运行结果x = 200; 显然ClassB中的initVar 方法覆盖了父类中的initVar方法。
总结:
(1)继承的优点:
a. 抽取重复代码,简历类之间的关系。
b. 子类可以拥有父类中所有成员变量和方法。
c. 基本上所有类的根类都是NSObject。
(2)注意:
a. 父类必须声明在子类前面。
b. 不允许子类和父类有相同名称的成员变量。
c. 调用某个方法时,优先去当前类中找,如果找不到,去父类中找。
(3)重写:
子类重新实现父类中的某个方法,覆盖父类以前的方法。
(4)什么时候创建子类:
a. 希望继承一个类的函数,或许加入一些新的方法和实例变量。
b. 希望创建一个类的特别版本(图形对象的特定类型)。
c. 希望通过覆写一个或多个方法来改变类的默认行为。
0 0
- object-c的继承
- object-c之继承
- Object-c 继承
- Object C 继承
- Object-c------继承
- Object-C之继承
- object-c 学习(继承)
- Object-C封装,继承,多态
- 【Object-C】继承,super关键字
- Object C 实现 “多继承”
- Object-C 继承.重写.重载
- Object-C学习笔记三-----继承
- Object-C: 学习实例之继承
- Object-C学习 继承 编译预处理
- Object-c基础知识(二)继承复合
- 黑马程序员--Object-C--03--继承、多态
- object-c中类的继承
- object -c笔记之导入和继承
- 视频聊天室如何成功赚钱分享攻略二
- 视频:《博物馆3》猴子闹罗宾哭 大表哥客串
- 递归算法
- if 语句会出现的问题
- VS2008下编译linphone3.5.2
- Object C 继承
- 深入理解 retain,copy,mutableCopy
- 在 Eclipse 下利用 gradle 构建系统
- 判断日期在所在年中的位置
- ElasticSearch模块threadpool
- HTML中设置td的字体颜色
- wince系统中自绘button响应WM_LBUTTONUP和WM_LBUTTONDOWN两个消息
- openfilediaolog
- 几个机器学习算法及应用领域相关的中国大牛