前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >对象、消息、运行期--9:类族模式

对象、消息、运行期--9:类族模式

作者头像
xy_ss
发布2023-11-22 08:19:20
1190
发布2023-11-22 08:19:20
举报
文章被收录于专栏:浮躁的喧嚣浮躁的喧嚣

类族模式

这种模式最大的好处就是,可以隐藏抽象基类背后的复杂细节,使用者只需调用基类简单的方法就可以返回不同的子类实例。比如NSArray、NSDictionary、UIButton等

我们通过NSArray为例,先看俩个函数

  • -(BOOL)isKindOfClass:(Class)aClass; 接收者是否是aClass类的实例或者从这个类继承的任何类的实例。如果是返回yes
  • -(BOOL)isMemberOfClass:(Class)aClass; 接收者是否是aClass的实例,如果是返回yes。
代码语言:javascript
复制
NSArray *array = [[NSArray alloc]init];
if ([array isKindOfClass:[NSArray class]]) {                        
    NSLog(@"isKindOfClass");
}
if ([array isMemberOfClass:[NSArray class]]) {
    NSLog(@"isMemberOfClass");
}

log:isKindOfClass

很明显array不是NSArray的一个实例

代码语言:javascript
复制
NSLog(@"%@",[[array superclass] debugDescription]);

log:NSArray

通过这个可以证明NSArray是一个抽象的基类,而array是NSArray子类实例化出来的一个对象,这种设计模式就是类族模式

接下来写一个demo来说明类族

代码语言:javascript
复制
#import <Foundation/Foundation.h>
//定义一个继承与NSObject的抽象基类Phone,基类中定义一个枚举类型
typedef NS_ENUM(NSInteger,PhoneType){
    PhoneTypeiPhone,
    PhoneTypeAndroid,
};
@interface Phone : NSObject
+ (Phone *)phoneType:(PhoneType)type;
- (void)call;
@end


#import "Phone.h"
#import "iPhone.h"
#import "AndroidPhone.h"
@implementation Phone
//为Phone声明实现一个类方法和实例方法
+ (Phone *)phoneType:(PhoneType)type{
    switch (type) {
        case PhoneTypeiPhone:
            return [iPhone new];
            break;
        case PhoneTypeAndroid:
            return [AndroidPhone new];
            break;
    }
}
- (void)call{
    
}
@end
代码语言:javascript
复制
//创建2个继承与Phone的子类
#import "Phone.h"
@interface iPhone : Phone
@end

#import "iPhone.h"
@implementation iPhone
- (void)call{
    NSLog(@"iPhone call");
}
@end
代码语言:javascript
复制
//创建2个继承与Phone的子类
#import "Phone.h"
@interface AndroidPhone : Phone
@end

#import "AndroidPhone.h"
@implementation AndroidPhone
- (void)call{
    NSLog(@"AndroidPhone call");
}
@end
代码语言:javascript
复制
Phone *iphone =[Phone phoneType:PhoneTypeiPhone];
[iphone call];
Phone *andriod =[Phone phoneType:PhoneTypeAndroid];
[andriod call];

log:
iPhone call
AndroidPhone call

参考

Effective+Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 类族模式
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档