當一個子類別中有一個方法,名稱與父類別完全一樣時,子類別的方法會取代父類別的方法,這就叫方法的覆蓋 override

以之前車子的例子來說,我們有一個父類別 Car 與子類別 TurboCar,在 Car 類別中,我們設一個方法叫加速 speedUp,每做一次,就加速 10,那我們可以這樣寫: 

// Car 類別 
@interface Car : NSObject 
@property int speed; 
-(viod)speedUp;  //宣告加速方法
@end 

@implementation Car  
 
-(viod)speedUp{
    self.speed=self.speed+10;  //加速,將實體變數自已的 speed 加 10 
}
@end 

子類別 TurboCar 也是一台車,繼承於 Car,程式碼如下
 
 // Turbo Car 類別 
@interface turboCar : Car 
@end 

@implementation turboCar 
@end
 

在上面這個 turboCar 類別中,繼承了 Car 類別,所以不用建 speed 的實體變數,同時也繼承了 speedUp 的方法。

所以當我們在主程式中,使用這樣的 Code

        Car *theCar=[[Car alloc] init];
        turboCar *theTurboCar=[[turboCar alloc] init];
        [theCar speedUp];
        [theTurboCar speedUp];
        NSLog(@"The Car speed:%i   The Turbo Car Speed:%i",theCar.speed,theTurboCar.speed);

就會輸出【The Car speed:10  The Turbo Car Speed:10】,對 theTurboCar 這個實體來說,它的 SpeedUp 繼承了 Car 的方法,所以可以使用。
 
但我們想要做的是 TurboCar  增加性能,每次加速時 加速 20 那我們就要在 turboCar 類別寫入一個 speedUp 方法,取代 Car 的方法。程式改寫入下:

 // Turbo Car 類別 
@interface turboCar : Car 
@end 

@implementation turboCar 
-(viod)speedUp{
    self.spee=self.speed+20;  //加速,將實體變數自已的 speed 加 20 
}
@end


那前面同樣的程式,TurboCar 就不會再繼承 Car 的 speedUp 方法,但其他的部份依然會繼承,如下面的主程式:

        Car *theCar=[[Car alloc] init];
        turboCar *theTurboCar=[[turboCar alloc] init];
        [theCar speedUp];
        [theTurboCar speedUp];
        NSLog(@"The Car speed:%i   The Turbo Car Speed:%i",theCar.speed,theTurboCar.speed);

會輸出【The Car speed:10  The Turbo Car Speed:20】。
文章標籤
創作者介紹

X Code Objective-C Swift 學習記錄 for iOS & macOS (OS X)

shenfive 發表在 痞客邦 PIXNET 留言(0) 人氣()