程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> OC教程3-類目延展協議

OC教程3-類目延展協議

編輯:關於C語言

OC教程3-類目延展協議


OC3-語言特性

本章主要講解OC語言特性

  1. 類目(Category)
  2. 延展(Extension)
  3. 協議(Protocol)

    1,類目

    OC語言中的類目機制只有一個作用:為任何一個類添加方法

    現在我們創建一個Student類

    @interface Student : NSObject
    
    @property(nonatomic,strong)NSString * name;
    
    @end
    
    @implementation
    
    @end
    

    如果想為Student類添加一個方法,現在有兩種方法

    1. 直接修改Student類的源碼,聲明一個方法並實現。
    2. 使用類目。

      在無法獲取類的源碼且需要給一個類添加方法的情況下,類目的作用就非常重要了。

      創建類目的語法也非常簡單,代碼如下

      @interface Student (Test)
      
      -(void)test;
      
      @end
      
      @implementation Student (Test)
      
      -(void)test
      {
          NSLog(@"這裡是Student類目的test方法");
      }
      @end
      

      聲明和實現的關鍵字都和之前一樣。

      不同的是,聲明時候不需要指定父類,而是直接寫要添加方法的類的名字,但後面一定要加一個括號,且括號裡面寫上類目名字。一個類可以有多個類目。

      有了這個類目之後,雖然Student類的源碼中沒有test方法,但仍然可以正常用Student對象去調用這個方法。

      Student * s = [[Student alloc] init];
      [s test];
      

      2,延展

      延展可以看作是一種匿名的類目,類有時需要一些只為自己所見,所用的私有方法這種私有方法可以通過延展的方式來聲明。

      比如上文中的Student類有一個作弊的方法,不像被外界看得,但有不影響本身調用。這個方法就可以聲明在延展內,而方法的實現仍然在Student的類內。

      @interface Student ()
      -(void)zuobi;
      @end
      

      通常我們會將類的聲明放在擴展名為.h的文件內,實現放在擴展名為.m的文件內。在生產的可執行文件包種.m文件會被編譯加密成.a文件,且不可逆轉。

      Student.h文件

      @interface Student : NSObject
      
      @property(nonatomic,strong)NSString * name;
      
      @end
      

      Student.m 文件

      @interface Student ()
      -(void)zuobi;
      @end
      
      @implementation Student (Test)
      
      -(void)test
      {
          NSLog(@"這裡是Student類目的test方法");
      }
      
      -(void)zuobi
      {
          NSLog(@"正在作弊");
      }
      
      @end
      

      通常將延展的聲明也放在.m文件中,這樣便可以隱藏類的方法,不被外界所發現且類內可以正常使用。

      3,協議

      OC中的協議為一組方法的聲明。不需要實現。遵守協議的類負責實現協議中的方法。

      協議使用@protocol關鍵字進行聲明。

      其聲明的方法中分為必須實現的方法和可選實現的方法。分別用@required@optional關鍵字標示。

      如果不寫默認為必須實現的方法。

      @protocol Test 
      
      @required
      -(void)fun1;//遵守該協議的類,必須實現的方法
      
      @optional
      -(void)fun2;//遵守該協議的類,可選實現的方法
      
      @end
      

      制定協議很簡單,我們可以通過協議去規定一個對象的行為。

      例如下面的方法

      -(void)test:(id)obj;
      

      這個方法便要求,obj對象必須是遵守Test協議的類創建的對象。

      @property id obj;
      

      同樣,屬性對象也可以用協議進行規定。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved