objc 关于多态使用的的一点简单总结

Priter

.h
@interface Printer : NSObject
- (void)printer;
@end
.m
@implementation Printer
- (void)printer
{
    NSLog(@"This is Priter!");
}
@end

WHPriter

.h
@interface WhPriter : Printer
@end
.m
@implementation WhPriter
- (void)printer
{
    NSLog(@"This is WHPriter!");
}
@end

ColorPriter

.h
@interface ColorPriter : Printer
@end
.m
@implementation ColorPriter
- (void)printer
{
    NSLog(@"This it ColorPriter!");
}
@end

Person

.h
@class Printer;
@interface Person : NSObject
- (void)usePriter:(__kindof Printer *)priter;
@end
.m
#import "Person.h"
#import "Printer.h"
@implementation Person
- (void)usePriter:(__kindof Printer *)priter
{
    NSLog(@"priter:%@", NSStringFromClass([priter class]));
    [priter printer];
}
@end

main.m

int main(int argc, char * argv[]) {
    Person *person = [[Person alloc] init];
    Printer *whiterPriter = [[WhPriter alloc] init];
    Printer *colorPriter = [[ColorPriter alloc] init];
    [person usePriter:whiterPriter];
}

main.cpp

int main(int argc, char * argv[]) {
      Person *person = ((Person *(*)(id, SEL))(void *)objc_msgSend)((id)((Person *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("Person"),             sel_registerName("alloc")), sel_registerName("init"));
      Printer *whiterPriter = ((WhPriter *(*)(id, SEL))(void *)objc_msgSend)((id)((WhPriter *(*)(id, SEL))(void *                                             )objc_msgSend)((id)objc_getClass("WhPriter"), sel_registerName("alloc")), sel_registerName("init"));
          ((void (*)(id, SEL, Printer *))(void *)objc_msgSend)((id)person, sel_registerName("usePriter:"), (Printer *)whiterPriter);
  }

总结

  • 多态的实现依赖于继承
  • 子类重写父类的方法时不需要在.h文件中再次声明方法
  • 在实现多态时,调用子类的方法只需要引入父类头文件就可以了,不需要引入子类头文件也可以实现子类的方法
  • iOS 7 中引入了 __kindof 特性,所以在使用多态的父类作为参数时可以加入 __kindof 特性,使代码更易读
ps: 如果有不对的地方请指出,相互交流,谢谢!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,780评论 18 399
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,268评论 0 2
  • 、6一、基本知识 1.JDK和JRE的区别 答:JDK是java语言开发工具包,包含JRE和开发工具(javac....
    梦游的沙师弟阅读 1,231评论 0 4
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,703评论 0 11
  • 许老师给马老师念书那一段我觉得太尴尬了,他在给一个公众形象是入世的人表演一段在当前意境下十分出世,甚至出戏的但又符...
    gavinyangyang阅读 244评论 0 0