——黑馬程序員——OC中的繼承

-----------android培訓java培訓、java學習型技術博客、期待與您交流!-----------

OC中的繼承

一、繼承概念

繼承:子類(派生類)擁有了父類同樣的方法和屬性(實例變量)過程,繼承是指類和類之間的關係,子類可以對父類的行爲進行擴展、覆蓋和重定義

二、繼承的優點:

1、省去大量的代碼

2、使類和類之間建立起了聯繫

例如:

//動物繼承NSObject 類

@interface Animal: NSObject

{

}

-(void) run;

@end


//類的實現

@implementation Animal

-(void) run{

NSLog(@"狗正在跑");

}

@end


//創建狗的類

@interface Dog:Ainmal

-(void)lookhome;

@

//狗類的實現

@implementation Dog

-(void)lookhome{


NSLog(@"狗正在瞪着眼睛看家");


}

@end

#import <Foundation/Foundation.h>

//動物繼承NSObject 類
@interface Animal: NSObject
{
	
}
-(void) run;
@end

//類的實現
@implementation Animal
-(void) run{
NSLog(@"動物正在跑");
}
@end

//創建狗的類
@interface Dog: Animal
-(void)lookhome;
@end
//狗類的實現
@implementation Dog
-(void)lookhome{

NSLog(@"狗正在瞪着眼睛看家");

}
@end

int main (int argc, const char *argv[]) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];                         
   
    //匿名類調用方法
    [[Animal new] run ];
    [[Dog new] lookhome ];
    
    //創鍵對象
    Dog *d = [Dog new];
    //讓Dog調用run的方法
    [d run];
   
    [pool drain];
    return 0;
}


<span style="font-size:14px;">#import <Foundation/Foundation.h>

//動物繼承NSObject 類
@interface Animal: NSObject
{

NSString * _name;
int _age;	
}
//定義set get方法
-(void)setName:(NSString *) name;
-(void)setAge:(int) age;
-(NSString *)name;
-(int)age; 
//定義run方法
-(void) run;
@end

//類的實現
@implementation Animal
//set get方法的實現
-(void)setName:(NSString *) name{
	_name = name;	
	}
-(void)setAge:(int) age{
	_age = age;
	}
-(NSString *)name{
	return _name;
	}
-(int)age{
	return _age;
	}

-(void) run{
NSLog(@"動物歲正在跑");
}
@end

//創建狗的類
@interface Dog: Animal
-(void)lookhome;
@end
//狗類的實現
@implementation Dog
-(void)lookhome{

NSLog(@"狗正在瞪着眼睛看家");

}
@end

int main (int argc, const char *argv[]) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];                         
   

    [[Dog new] lookhome ];
    
    //創鍵對象
    Animal *a = [Animal new];
    Dog *d = [Dog new];
    
    //用set方法給動物實例變量賦值
    [a setName: @"脊椎動物"];
    [a setAge: 100];
    
    NSLog(@"%@%d歲",[a name],[a age]);
    //調用方法
    [a run];
    
    //給狗設置名稱和年齡  狗類本身沒喲實力變量_name,_age,因爲Dog繼承了父類,父類有
    [d setName: @"小黃"];
    [d setAge: 5];
    //讓d調用run的方法

    NSLog(@"這個狗叫%@今年%d歲", [d name], [d age]);
    [d run];
    [pool drain];
    return 0;
}</span>


三、基類和派生類之間的關係

1、派生類不但擁有基類的方法和屬性,還可以自己增加屬性和方法

2、基類的私有屬性能被繼承但是不能被訪問

3、OC中的繼承是單一繼承,一個類只能繼承一個父類

4、要注意繼承的合理性,只有一類的可以繼承

四、方法的重寫(重點)

當子類從父類繼承方法不適合子類時,可以在子類中重寫父類的方法
執行過程是:先調用自己子類中的方法,如果自己類中沒有方法再去父類中查找,如果父類中依然沒有該方法則程序報錯

#import <Foundation/Foundation.h>

//動物繼承NSObject 類
@interface Animal: NSObject
{

NSString * _name;
int _age;	
}
//定義set get方法
-(void)setName:(NSString *) name;
-(void)setAge:(int) age;
-(NSString *)name;
-(int)age; 
//定義run方法
-(void) run;
@end

//類的實現
@implementation Animal
//set get方法的實現
-(void)setName:(NSString *) name{
	_name = name;	
	}
-(void)setAge:(int) age{
	_age = age;
	}
-(NSString *)name{
	return _name;
	}
-(int)age{
	return _age;
	}

-(void) run{
NSLog(@"動物正在跑");
}
@end

//創建狗的類
@interface Dog: Animal
-(void)lookhome;
@end
//狗類的實現
@implementation Dog
-(void)lookhome{

NSLog(@"狗正在瞪着眼睛看家");

}

<strong><span style="color:#ff0000;">//重寫父類Animal的方法,
-(void) run{
NSLog(@"狗正在跑");</span></strong>
}

@end

int main (int argc, const char *argv[]) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];                         
   

    [[Dog new] lookhome ];
    
    //創鍵對象
    Animal *a = [Animal new];
    Dog *d = [Dog new];
    
    //用set方法給動物實例變量賦值
    [a setName: @"脊椎動物"];
    [a setAge: 100];
    
    NSLog(@"%@%d歲",[a name],[a age]);
    //調用方法
    [a run];
    
    //給狗設置名稱和年齡  狗類本身沒喲實力變量_name,_age,因爲Dog繼承了父類,父類有
    [d setName: @"小黃"];
    [d setAge: 5];
    //讓d調用run的方法

    NSLog(@"這個狗叫%@今年%d歲", [d name], [d age]);
    //當dog類調用run 時 顯示的是動物在跑,我們想要讓他顯示狗再跑,因此就需要方法重寫
    [d run];
    [pool drain];
    return 0;
}


五、繼承使用的注意事項

1、子類不能定義和父類同名的變量,因爲子類已經繼承了基類的屬性和方法,相同時程序報錯,

2、OC中只能單一繼承,不支持多繼承

3、OC中支持多層繼承

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章