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,765評論 18 399
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態方法,可以作為本類的靜態方法來...
    XLsn0w閱讀 1,263評論 0 2
  • 、6一、基本知識 1.JDK和JRE的區別 答:JDK是java語言開發工具包,包含JRE和開發工具(javac....
    夢游的沙師弟閱讀 1,218評論 0 4
  • 一:java概述:1,JDK:Java Development Kit,java的開發和運行環境,java的開發工...
    ZaneInTheSun閱讀 2,687評論 0 11
  • 許老師給馬老師念書那一段我覺得太尷尬了,他在給一個公眾形象是入世的人表演一段在當前意境下十分出世,甚至出戲的但又符...
    gavinyangyang閱讀 239評論 0 0