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
原创粉丝点击