IOS之Objective-C學習筆記(三)


      今天開始學習Objective-C中的繼承,繼續記錄自己的學過程,好~我們現在開始。

 相信大家都非常清楚為什么要使用繼承的原因了,所以在這里就不再多說明了。回憶上一篇文章中的Circle和Rectangule類接口程序,兩個接口的代碼非常相似,基本上除了類名不同其余都是一樣的。連方法的實現也是基本一樣的。

    1.繼承的語法:

           (1)這時是沒使用繼承時的結構圖:

               

         (2)為了減少代碼的重復性,我們創建一個Shape類,然后Circle和Rectangule都繼承它:  

[plain] view plaincopy
  1. @interface Shape : NSObject  
  2.           {  
  3.                 ShapeColor  fillColor;  
  4.                  ShapeRect  bounds;  
  5.           }  
  6.           -(void) setFillColor : (ShapeColor)fillColor;  
  7.           -(void) setBounds : (ShapeRect) bounds;  
  8.           -(void) draw;  
  9.           @end//這里創建了一個Shape類,值得一提的是:第一行的冒號后面的代表Shape 繼承NSObject類  

         (3)接着實現這個新類:

[plain] view plaincopy
  1. @implementation Shape  
  2.         -(void) setFillColor : (ShapeColor ) c  
  3.         {  
  4.             fillColor = c;  
  5.         }  
  6.         -(void) setBounds : (ShapeRect) b  
  7.         {  
  8.             bound = b;  
  9.         }  
  10.         -(void) draw{ }  
  11.         @end//這里實現了Shape接口  

              從上面可以看出draw方法沒有實現任何功能,這是因為它的具體功能由它的子類來復寫完成。

          (4)使Circle和Rectang繼承Shape:

[plain] view plaincopy
  1. @interface Circle : Shape  
  2.             @end //繼承Shape  
  3.             @interface Rectangle : Shape  
  4.             @end//繼承Shape  

          (5)復寫各自的draw方法完成各自具體功能:

[plain] view plaincopy
  1. @Implementation Circle  
  2.            -(void) draw   
  3.             {  
  4.                  NSLog(@"drawing a circle at (%d %d %d %d) in %d",bounds.x , bounds.y , bounds.width , bounds.height , colorName(fillColor));  
  5.             }   
  6.            @end//復寫draw方法,Rectangule的實現也是類似。  

         (6)相關術語:

            超類:是你所繼承的類

            父類:超類的另一種叫法

            子類:是實施繼承的類。

      2.繼承后的方法調度機制

        (1)我們可以先看看調用的流程圖:

        

        

          (2)由上圖可見,當代碼發送消息時,Objective-C的方法調度程序將在當前類中搜索相應的方法,如果調度程序無法在接收消息的對象類中找到相應的方法,它就在該對象                 的 超類中進行查找,如果還沒有,就繼續沿着繼承的類NSObject類進去繼續找,最終沒找到的話就話報錯。

          (3)有圖可以看出,實例對象有一個指向Circle類的指針,同時Circle類有一個指向其對應的代碼的指針,Shape也有一個指向其對應代碼的指針。

      3.實例變量的繼承:

          (1)子類除了可以繼承父類的實例變量還可以按自己的需要添加新的實例變量,而這些實例變量在內存里的布局情況是這樣的:

                                                  

        (2)從上圖可以看出,第一個是NSObject聲明的一個名為isa的實例變量,該變量保存一個指針指向該對象的類,接下來是Shape的實例變量,最后是子類自己添加的新變量

        (3)每個方法的調用都獲得一個self隱藏參數,它是一個指向接收消息的對象的指針。方法是使用self參數來查找它們要使用的實例變量的。如下圖:

                                                

     4.重寫方法:

        (1)當子類進行方法的重寫時,父類的方法內容會被覆蓋掉,這時是運行子類重寫的方法。但有時還是要從子類里使用父類的原來的那個方法,這時可以使用super關鍵字。

        (2)使用super的例子:

[plain] view plaincopy
  1. @implemention Circle  
  2.         -(void) setFillColor : (ShapeColor) c  
  3.          {  
  4.               if (c == kRedColor){  
  5.                   c = kGreenColor;    
  6.               }  
  7.               [ super  setFillColor : c ];  
  8.          }  
  9.          @end//使用super使用父類的原方法  

             流程圖如下:

             

好了~今天就寫那么多,歡迎大家一起討論,轉載請注明:http://blog.csdn.net/yuzhiboyi


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: