关闭

oc继承

106人阅读 评论(0) 收藏 举报


    博客分类: 

类的继承是oop中的基本原则,下面就来分析一下oc的类和继承

   在实现继承出现了子类的.m文件报错 mission@end 导致程序没发编译,最后发现是.h中少了一个@end 

 

父类    TestExtends.h文件

Oc代码  收藏代码
  1. @interface TestExtends: NSObject{  
  2.       
  3. NSString* name;  
  4.       
  5. }  
  6. @property NSString *name; //类似set和get方法  
  7.   
  8. //@property name;  
  9.   
  10.   
  11. -(void)setName:(NSString*)newName;//定义方法  
  12.   
  13. -(id)initWithC:(NSString*)newName;//定义构造方法  
  14.   
  15.   
  16. @end  
  17.   
  18. #endif /* TestExtends_h */  

TestExtends.m文件

伦理片 http://www.dotdy.com/

Oc代码  收藏代码

  1. #import <Foundation/Foundation.h>  
  2. #import "TestExtends.h"  
  3.   
  4. @implementation TestExtends  
  5.   
  6. @synthesize name;  
  7.   
  8. -(void)setName:(NSString*)newName{  
  9.   
  10.     NSLog(@"调用父类的setName方法");  
  11.   
  12. }  
  13.   
  14. -(id)initWithC:(NSString *)newName{  
  15.     if (self==[super init]) {  
  16.         name=newName;//  
  17.         NSLog(@"父类的构造方法被调用。。。。");  
  18.     }  
  19.   
  20.     return self;  
  21. }  
  22.   
  23. @end  

 

mian文件

Oc代码  收藏代码
  1. TestExtends* te=[[TestExtends alloc] init];  
  2.        [te setName:@"Object-c"];  
  3.        NSLog(@"简单的实现");   

 

运行结果:

2015-11-04 22:35:10.327 test_01[1287:67105] 调用父类的setName方法

2015-11-04 22:35:10.328 test_01[1287:67105] 简单的实现

 

(lldb) 

 

分析

创建对象

 

   TestExtends* te=[[TestExtends alloc] init];

调用setName方法

        [te setName:@"Object-c"];

 

        NSLog(@"简单的实现");

 

 

子类  定义Person类继承TestExtends类

 

TestExtends.h文件

Oc代码  收藏代码
  1. #import "TestExtends.h"  
  2.   
  3. @interface Person :TestExtends  
  4.   
  5. @property NSString* address;//定义变量  
  6.   
  7. -(void)setAddress:(NSString*)newAssress;//定义方法  
  8.   
  9. -(id)initWithChild:(NSString*)newAssress;//定义构造函数的方法  
  10.   
  11. @end  
  12.   
  13.   
  14. #endif /* Person_h */  

 

TestExtends.m文件

 

Oc代码  收藏代码
  1. #import "Person.h"  
  2.   
  3. @implementation Person  
  4.   
  5. @synthesize address;  
  6.   
  7.   
  8. -(void)setAddress:(NSString *)newAssress{  
  9.   
  10.     [super setName:newAssress];  
  11.       
  12.     NSLog(@"子类的地址是%@",newAssress);  
  13. }  
  14.   
  15. -(id)initWithChild:(NSString *)newAssress{  
  16.   
  17.       
  18.     if (self==[super initWithC:newAssress]) {  
  19.   
  20.         address=newAssress;  
  21.         NSLog(@"子类的构造函数被调用了。。。");  
  22.     }  
  23.     return self;  
  24. }  
  25.   
  26.   
  27. @end  

 

main文件

Java代码  收藏代码
  1. Person* tec=[[Person alloc]initWithChild:@"Android"];  
  2.     [tec setAddress:@"China"];  
  3.       

运行结果:

Oc代码  收藏代码
  1. 2015-11-04 22:40:42.288 test_01[1306:70521] 父类的构造方法被调用。。。。  
  2. 2015-11-04 22:40:42.289 test_01[1306:70521] 子类的构造函数被调用了。。。  
  3. 2015-11-04 22:40:42.289 test_01[1306:70521] 调用父类的setName方法  
  4. 2015-11-04 22:40:42.289 test_01[1306:70521] 子类的地址是China  
  5. (lldb)   

分析:

  1,  Person* tec=[[Person alloc]initWithChild:@"Android"];创建对象首先调用父类的方法:原因如下

Java代码  收藏代码
  1. -(id)initWithChild:(NSString *)newAssress{  
  2.   
  3.       
  4.     if (self==[super initWithC:newAssress]) {//调用父类的构造方法  
  5.   
  6.         address=newAssress;  
  7.         NSLog(@"子类的构造函数被调用了。。。");  
  8.     }  
  9.     return self;  
  10. }  

 

  

2, [tec setAddress:@"China"];方法中存在 [supersetName:newAssress];调用父类的方法

 

 影音先锋电影 http://www.iskdy.com/

 

将mian文件中的  Person* tec=[[Personalloc]initWithChild:@"Android"];

        [tec setAddress:@"China"];

 

改为  TestExtends* te=[[Person allocinit];

        [te setName:@"nihao"];

 

运行结果:



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:127138次
    • 积分:2035
    • 等级:
    • 排名:第19002名
    • 原创:0篇
    • 转载:504篇
    • 译文:0篇
    • 评论:6条
    文章存档