一、概念:
面向对象提供了继承语法,能大大简化代码。把公共的方法和实例变量写在父类里,子类字需要写自己独有的实例变量和方法即可。
继承既能保证类的完整,又能简化代码。
二、继承的特点:
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
时间: 2024-10-19 06:09:31