Objective-C----继承
2015-06-19 15:17
519 查看
一、概念:
面向对象提供了继承语法,能大大简化代码。把公共的方法和实例变量写在父类里,子类字需要写自己独有的实例变量和方法即可。继承既能保证类的完整,又能简化代码。
二、继承的特点:
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
相关文章推荐
- Could not reserve enough space for object heap解决办法
- Objective-C程序设计第三章:类,对象和方法
- Objective-C----@class 和 #import
- Objective-C----初识Objective-C
- Objective-C中一个方法如何传递多个参数的理解
- Objective-c中的相对路径和绝对路径
- <NSCoding>存储数据 archivedDataWithRootObject unarchiveObjectWithData
- 操纵JsonObject的方法
- Objective-C----防御式编程
- 【iOS开发之Objective-C】新建第一个工程-HelloWorld
- Objective-C----setter 和 getter
- CocoaPods一个Objective-C第三方库的管理利器
- Objective-C----NSLog( )
- Objective-C 2.0的运行时编程
- objective-c中的method swizz实现"猴打补丁"
- objective-c中的method swizz实现"猴打补丁"
- objective-c中的method swizz实现"猴打补丁"
- Java中Object类hashCode的底层实现
- Object.defineproperty实现数据和视图的联动
- 黑马程序员--内部类、Object类