Objective-C----继承

一、概念:

面向对象提供了继承语法,能大大简化代码。把公共的方法和实例变量写在父类里,子类字需要写自己独有的实例变量和方法即可。

继承既能保证类的完整,又能简化代码。

二、继承的特点:

OC 中只允许单继承。
没有父类的类成为根类,OC中的根类是NSObject(祖宗)。
继承的内容:所有实例变量和方法。
如果子类不满意父类方法的实现,可以重写(overwrite)父类的方法。

三、方法调度机制:

当代码发送消息时,Objective-C的方法调度机制将在当前的类中搜索相应的方法。如果无法在接收消息的对象的类文件中找到相应的方法,它就会在该对象的超类中进行查找。

每个方法调用都获得了一个名为 self 的隐藏参数,它是一个指向接收消息的对象的指针。这些方法通过 self 参数来寻找它们需要用到的实例变量。

super ,既不是参数也不是实例变量,而是由 Objective-C 向该类的超类发送消息。如果超类中没有定义改消息,Objective-C会和平常一样继续在继承链上一级中查找。一直查找到根类。

四、什么情况下用复合?什么情况下用继承?

继承的类之间建立的关系为“is a”(是一个)。三角形是一个形状,V6 是一个发动机,米其林 是一种轮胎的名字。如果可以说“X 是一个 Y”,那就可以使用继承。
另一方面,复合的类之间建立的关系为“has a”(有一个)。形状有一个填充颜色,汽车有一个发动机和四个轮胎。与继承不同,汽车不是一个发动机,也不是一个轮胎。如果可以说“X 有一个 Y”,那么就可以使用复合。

五、直接上例代码

#import <Foundation/Foundation.h>
#import "Student.h"

int main(int argc, const char * argv[]) {

    // 一个类可以拥有多个子类,一个类只能拥有一个直接父类(单继承的概念),但是可以拥有多个超类。

    Student *student = [[Student alloc] initWithName:@"wang" gender:@"nv" age:31] ;
    [student eat] ;
    [student sleep] ;

    Student *otherStudent = [[Student alloc] initWithName:@"zhen" gender:@"nan" age:12 number:11011 schoolName:@"hafu"] ;
    [otherStudent study] ;



    return 0;
}

Student.h 文件:

//
//  Student.h
//
//  Created by  on 15/4/1.
//  Copyright (c) 2015年 . All rights reserved.
//

#import "Person.h"


// 定义子类是在父类继承而来的特征(实例变量)和行为(方法)的基础上定义自己特有的特征和行为
@interface Student : Person
{
    int       _number ;
    NSString *_schoolName ;
}

- (void)setNumber: (int)number ;
- (void)setShoolName: (NSString *)schoolName ;


- (int)number ;
- (NSString *)schoolName ;

- (instancetype)initWithName:(NSString *)name
                      gender:(NSString *)gender
                         age:(int)age
                      number:(int)number
                  schoolName:(NSString *)schoolName ;

- (void)study ;



@end // Student : Person

Student.m 文件:

//
//  Student.m
//
//  Created by  on 15/4/1.
//  Copyright (c) 2015年 . All rights reserved.
//

#import "Student.h"

@implementation Student

- (void)setNumber:(int)number {
    _number = number ;
} // setNumber

- (void)setShoolName:(NSString *)schoolName {
    _schoolName = schoolName ;
} // setSchoolName

- (int)number {
    return _number ;
} // number

- (NSString *)schoolName {
    return _schoolName ;
} // schoolName

- (instancetype)initWithName:(NSString *)name
                      gender:(NSString *)gender
                         age:(int)age
                      number:(int)number
                  schoolName:(NSString *)schoolName {
    if ( self = [super initWithName:name
                             gender:gender
                                age:age] ) {
        _number = number ;
        _schoolName = schoolName ;
    }
    return self ;
} // initWithName

- (void)study {
    NSLog( @"%@在%@学校学习,学号:%d!",
          _name, _schoolName, _number ) ;
} // study

- (void)eat {
    [super eat] ;
    NSLog( @"喝西北风" ) ;
} // eat


@end // Student : Person





Person.h 文件:

//
//  Person.h
//
//  Created by  on 15/4/1.
//  Copyright (c) 2015年 . All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    NSString *_name ;
    NSString *_gender ;
    int       _age ;
}

//setter设置器
- (void)setName: (NSString *)name ;
- (void)setGender: (NSString *)gender ;
- (void)setAge: (int)age ;

//getter访问器
- (NSString *)name ;
- (NSString *)gender ;
- (int)age ;

// 初始化
- (instancetype)initWithName: (NSString *)name
                      gender: (NSString *)gender
                         age: (int)age ;

- (void)eat ; // 吃
- (void)sleep ; // 睡

@end  //  Person

Person.m 文件:

//
//  Person.m
//
//  Created by  on 15/4/1.
//  Copyright (c) 2015年 . All rights reserved.
//

#import "Person.h"

@implementation Person

- (void)setName:(NSString *)name {
    _name = name ;
} // setName

- (void)setGender:(NSString *)gender {
    _gender = gender ;
} // setGender

- (void)setAge:(int)age {
    _age = age ;
} // setAge

- (NSString *)name {
    return  _name ;
} // getName

- (NSString *)gender {
    return _gender ;
} // getGender

- (int)age {
    return _age ;
} // getAge

- (instancetype)initWithName:(NSString *)name
                      gender:(NSString *)gender
                         age:(int)age {
    if ( self = [super init] ) {
        _name = name ;
        _gender = gender ;
        _age = age ;
    }
    return self ;
} // initWithName

- (void)eat {
    NSLog( @"%@在餐厅吃饭!", _name ) ;
} // eat

- (void)sleep {
    NSLog( @"%@在睡觉!", _name ) ;
} // sleep


@end  //  Person






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值