5、继承性

继承概念

• 继承性是面向对象的重要概念之一,子类能够继承父类的 某些方法和成员变量。作用域限定符为private 的成员变量是不可以被继承的。子还可以重写父类的方法。
• 为了了解继承性,我们看看这样的一个场景:一位面向对象的程序员小赵,在编程过程中需要描述和处理个人信息, 于是他定义了类Person。

Person类

@interface Person: NSObject {
    NSString* name;
    int age;
    NSDate birthDate;
}
-(NSString*) getInfo;
@end

Student类

而一周以后,小赵又遇到了新的需求,需要描述和处理学生 信息,于是他又定义了一个新的类Student。

@interface Student : NSObject {
    NSString* name;
    int age;
    NSDate birthDate;
    NSString* school;
}
-(NSString*) getInfo;
@end

小结

Student和Person两个类的结构太接近了,后者只比前者多 出一个属性school,却要重复定义其它所有的内容。Objective-C提供了解决类似问题的机制,那就是类的继承。

  @interface Student : Person {
      NSString* school;
}

方法重写

子类不能继承父类中作用域限定符为@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 {
    printf( "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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值