OC的三大特性之多態

多態

 1.沒有繼承就沒有多態
 2.代碼的體現:父類類型的指針指向子類對象
 3.好處:如果函數\方法參數中使用的是父類類型,可以傳入父類、子類對象
 4.侷限性:

 1> 父類類型的變量 不能 直接調用子類特有的方法。必須強轉爲子類類型變量後,才能直接調用子類特有的方法


#import <Foundation/Foundation.h>
// 動物
@interface Animal : NSObject
- (void)eat;
@end


@implementation Animal
- (void)eat
{
    NSLog(@"Animal-吃東西----");
}
@end


// 狗
@interface Dog : Animal
- (void)run;
@end


@implementation  Dog
- (void)run
{
    NSLog(@"Dog---跑起來");
}
- (void)eat
{
    NSLog(@"Dog-吃東西----");
}
@end


// 貓
@interface Cat : Animal


@end


@implementation Cat
- (void)eat
{
    NSLog(@"Cat-吃東西----");
}
@end


// 這個函數是專門用來喂動畫
//void feed(Dog *d)
//{
//    [d eat];
//}
//
//void feed2(Cat *c)
//{
//    [c eat];
//}
//


// 如果參數中使用的是父類類型,可以傳入父類、子類對象
void feed(Animal *a)
{
    [a eat];
}


int main()
{
    // NSString *d = [Cat new];
    // [d eat];
    
    /*
    Animal *aa = [Dog new];
    // 多態的侷限性:父類類型的變量 不能 用來調用子類的方法
    //[aa run];
    
    // 將aa轉爲Dog *類型的變量
    Dog *dd = (Dog *)aa;
    
    [dd run];
    */
    
    //Dog *d = [Dog new];
    
    //[d run];
    
    /*
    Animal *aa = [Animal new];
    feed(aa);
    
    Dog *dd = [Dog new];
    feed(dd);
    
    Cat *cc = [Cat new];
    feed(cc);
     */
    
    /*
    // NSString *s = [Cat new];
    Animal *c = [Cat new];
    
    
    NSObject *n = [Dog new];
    NSObject *n2 = [Animal new];
    
    
    // 多種形態
    //Dog *d = [Dog new]; // Dog類型
    
    // 多態:父類指針指向子類對象
    Animal *a = [Dog new];
    
    // 調用方法時會檢測對象的真實形象
    [a eat];
    */
    return 0;
}

發佈了59 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章