當一個子類別中有一個方法,名稱與父類別完全一樣時,子類別的方法會取代父類別的方法,這就叫方法的覆蓋 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,程式碼如下
子類別 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 的方法,所以可以使用。
就會輸出【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】。
文章標籤
全站熱搜