Object C學習筆記23-繼承,重寫,重載


  前面的學習都一直在使用Object C對象,但是沒有具體總結過Object C中的對象使用特性,這里簡單總結一下。

  一.  繼承

    在面向對象編程中,子類可以通過繼承得到父類的可以繼承的的屬性和方法,在Object C中也同樣如此。

    先定義一個Person類,並且定義幾個屬性和一個方法:

#import <Foundation/Foundation.h>

@interface Person : NSObject{
    NSString *name;
    int age;
    NSArray *itmes;
}
@property (nonatomic,retain) NSString *name;
@property (nonatomic,assign) int age;
@property (nonatomic,retain) NSArray *itmes;

-(void) write;
@end
Person類的定義

    在上面的代碼中,Person類定義了三個屬性name,age,items,對應的類型分別為NSString,int,NSArray. 其中還有一個方法write,返回值類型為void,沒有輸入參數。其具體描述內容如下:

#import "Person.h"

@implementation Person

@synthesize name;
@synthesize age;
@synthesize itmes;

-(void) write{
    NSLog(@"%d",self.age);
    NSLog(@"Person 對象調用write方法");
}

@end
Person類

    在write方法中我們可以看到輸出了age,並且輸出一個字符串,這里又來標識具體調用哪個方法。

    再頂一個Student類,繼承Person類,在Person類中定義一個屬性address,為NSString類型,並且定義一個方法eat,返回值類型為void,沒有輸入參數,具體的代碼如下:

#import <Foundation/Foundation.h>
#import "Person.h"

@interface Student : Person{
    NSString *address;
}
@property (nonatomic,retain) NSString *address;

-(void) eat;

@end

-------------------------------------------------------------------
#import "Student.h"

@implementation Student
@synthesize address;

-(void) eat{
    NSLog(@"Student 調用eat方法");

}

@end
Student類

    通過如上代碼,Student就繼承了Person類的屬性和方法。

Person *person=[[Person alloc] init];
        person.age=43;
        [person write];
        Student *student=[[Student alloc] init];
        student.address=@"上海";
        student.age=99;
        [student eat];
        [student write];
測試代碼

    輸出如下結果:

2014-04-05 13:25:30.990 ObjectCApress[1659:303] 43
2014-04-05 13:25:30.992 ObjectCApress[1659:303] Person 對象調用write方法
2014-04-05 13:25:30.993 ObjectCApress[1659:303] Student 調用eat方法
2014-04-05 13:25:30.994 ObjectCApress[1659:303] 99
2014-04-05 13:25:30.995 ObjectCApress[1659:303] Person 對象調用write方法

    通過以上代碼我們可以看出,Student繼承了父類Person的屬性和方法。

 

  二. 重寫

    在調用對象繼承方法的時候,調用和執行的是基類的實現.但是,有時需要對派生類中的繼承方法有不同的實現.這個時候我們就需要重寫父類方法,但是在Object C中重寫和.NET中的重寫有點區別,不需要使用特殊的關鍵字標識。

    在Object C重寫父類方法,只需要重新實現該方法即可,代碼如下:

#import <Foundation/Foundation.h>
#import "Person.h"

@interface Student : Person{
    NSString *address;
}
@property (nonatomic,retain) NSString *address;

-(void) eat;

@end

-------------------------------------------------
#import "Student.h"

@implementation Student
@synthesize address;

-(void) eat{
    NSLog(@"Student 調用eat方法");

}

-(void) write{
    NSLog(@"調用Student的Write方法");
}

@end
重寫父類方法

    在上面的代碼中看出Student.m類中有一個write方法,其就是重寫父類方法,不需要使用任何其他的修飾符。在上面的代碼我們測試得到如果student類調用write 方法,其實是調用父類的方法,這里Student再調用write方法看看:

Student *student=[[Student alloc] init];
        student.address=@"上海";
        student.age=99;
        [student eat];
        [student write];

    輸出結果如下:

2014-04-05 13:36:21.055 ObjectCApress[1698:303] Student 調用eat方法
2014-04-05 13:36:21.058 ObjectCApress[1698:303] 調用Student的Write方法

    結果輸出"調用Student的write方法",說明這里不是調用的父類方法了

 

  三. 在子類調用父類方法

    在.NET中我們可以使用super關鍵字來調用,在在Object C中也可以使用super 來調用父類的方法。

-(void) write{
    NSLog(@"調用Student的Write方法");
    [super write];
}

    修改Student.m中的write方法,在這個方法中添加[super write] 語句用來調用父類的write方法。輸出結果如下:

2014-04-05 15:14:28.164 ObjectCApress[1815:303] Student 調用eat方法

2014-04-05 15:14:28.167 ObjectCApress[1815:303] 調用StudentWrite方法

2014-04-05 15:14:28.168 ObjectCApress[1815:303] 99

2014-04-05 15:14:28.168 ObjectCApress[1815:303] Person 對象調用write方法

    同樣使用以上代碼來測試,得到如上輸出的結果,從結果中我們可以看得出,使用super調用了父類方法。

 

  四. 重載

    .NET中重載就是方法名相同而輸入參數不一樣,在Object C中並沒有重載。

-(void) eat;
-(void) eat(int a);

    我們嘗試使用.NET的那種方式重載方法,如上代碼,使用編譯器編譯報錯,因為Object C中不支持方法的重載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM