Objective-C中实现“多继承”

简介:

    当单继承不够用,很难为问题域建模时,我们通常都会直接想到多继承。多继承是从多余一个直接基类派生类的能力,可以更加直接地为应用程序建模。但是Objective-C不支持多继承,由于消息机制名字查找发生在运行时而非编译时,很难解决多个基类可能导致的二义性问题。不过其实 Objective-C 也无需支持多继承,我们可以找到如下几种间接实现多继承目的的方法:

1)消息转发  

2)delegate和protocol  

3)类别   


1、利用消息转发实现见本人另一篇博客 http://my.oschina.net/Jacedy/blog/625343 ;

2、委托是Objective-C中最常用的一种回调机制,没什么好说的;

3、类别是个强大的东西,它可以为类添加方法,虽然它不能直接为类添加属性,但可以使用 runtime 中的objc_setAssociatedObject 和 objc_getAssociatedObject 方法间接为类添加属性。

143454_2MJq_580523.jpg

Person类为一新建的空类,现在利用类别为Person类添加 (nonatomic, copy) NSString *addr 属性:

?
1
2
3
4
5
6
7
8
9
10
11
// Person+Teacher.h
 
#import "Person.h"
 
@interface Person (Teacher)
 
- ( void )setAddr:(NSString *)addr;
 
- (NSString *)addr;
 
@end


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Person+Teacher.m
 
#import "Person+Teacher.h"
#import <objc/runtime.h>
 
const  char  *TeacherType =  "NSString *" ;
 
@implementation Person (Teacher)
 
- ( void )setAddr:(NSString *)addr
{
     objc_setAssociatedObject(self, TeacherType, addr, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
 
- (NSString *)addr
{
     NSString *addr = objc_getAssociatedObject(self, TeacherType);
     return  addr;
}
 
@end


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// main.m
 
  #import <Foundation/Foundation.h>
#import "Person+Teacher.h"
#import "Person.h"
 
int  main( int  argc,  const  char  * argv[]) {
     @autoreleasepool {
         
         Person *person = [[Person alloc] init];
         
         [person setAddr:@ "深圳" ];
         
         NSLog(@ "%@" , [person addr]);
     }
     return  0;
}

目录
相关文章
|
算法 数据安全/隐私保护 iOS开发
|
存储 缓存 iOS开发
深入Objective-C Runtime机制(一):类和对象的实现
1.概要      对于Runtime系统,相信大部分iOS开发工程师都有着或多或少的了解。对于Objective-C,Runtime系统是至关重要的,可以说是Runtime系统让Objective-C成为了区分于C语言,C++之外的一门独立开发语言,让OC在拥有了自己的面向对象的特性以及消息发送机制。并且因为其强大的消息发送机制,也让很多人认为Object
1952 0
|
存储 iOS开发
上古时代 Objective-C 中哈希表的实现
因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明。 写在前面 文章会介绍上古时代 Objective-C 哈希表,也就是 NXHashTable : NXHashTable 的实现 NXHashTable 的性
1340 0
|
iOS开发
iOS,Objective-C,相册功能的实现。
#import "ViewController.h" #define kuan [UIScreen mainScreen].bounds.size.width #define gao [UIScreen mainScreen].
847 0