Object C 继承

在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);
}

@end

int 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值