A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 脸皮猴 高级黑马   /  2014-3-17 08:50  /  2251 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 脸皮猴 于 2014-3-17 08:55 编辑

在OC中,按道理子类是不能和父类有相同变量的是吧,确实按正常走,
  1. #import <Foundation/Foundation.h>
  2. @interface Dog : NSObject
  3. {
  4.     double _tiZhong; //默认是@protected
  5.    
  6.     @public
  7.     int _age; //定义为@public就是有效的
  8. }
  9. @end

  10. @implementation Dog
  11. - (void)setTiZhong:(double)tiZhong
  12. {
  13.     _tiZhong = tiZhong;
  14. }
  15. @end

  16. @interface HaBa : Dog
  17. {
  18.     @protected
  19.     double _tiZhong; //@protected型
  20.    
  21.     @public
  22.     int _age; //定义为@public就是有效的
  23. }
  24. - (void)setTiZhong:(double)tiZhong;
  25. @end

  26. @implementation HaBa
  27. - (void)setTiZhong:(double)tiZhong
  28. {
  29.     _tiZhong = tiZhong;
  30. }
  31. @end
复制代码


在上面的代码中,子类HaBa有和父类Dog相同的成员变量!在XCODE是直接报错!

但是!!!!!!!
假如我的HaBa这个类我没有类的申明!只有实现!就不会报错!!!


  1. @implementation HaBa : Dog
  2. {
  3.     @protected
  4.     double _tiZhong; //@protected型
  5.    
  6.     @public
  7.     int _age; //定义为@public就是有效的
  8. }
  9. - (void)setTiZhong:(double)tiZhong
  10. {
  11.     _tiZhong = tiZhong;
  12. }
  13. @end
复制代码

如上的代码!我想知道为什么勒?按道理HaBa只是没有申明而已!但是也是继承了Dog啊!为什么不会有错勒!

评分

参与人数 3技术分 +1 黑马币 +15 收起 理由
董月峰 + 10 赞一个!
ios_fce + 5 神马都是浮云
jing迪 + 1

查看全部评分

6 个回复

倒序浏览
猴哥这问题犀利了,
回复 使用道具 举报
77媛儿 发表于 2014-3-17 08:52
猴哥这问题犀利了,

··不耻下问啊···这个问题刚刚看到变量的作用域的时候测试代码发现这个问题··又实在想不通··所以来求大神们解释···
回复 使用道具 举报
“假如我的HaBa这个类我没有类的申明!只有实现!就不会报错!!!”
对于这个问题,我先描述一下你一开始的做法:你前面的代码是在父类Dog实现了个setTiZhong的方法,但并没有在父类里面声明;接着你又定义了一个Dog的子类HaBa ,实现setTiZhong方法,并在子类声明了这个方法。
所以很明显错误就出来了,分析如下:
OC里面对于这个知识点的语法如下:
1、OC是不允许在子类和父类定义相同的成员变量。
2、OC定义类也可以只写实现不写声明。你的HaBa这个类写申明会报错是子类和父类定义了相同的成员变量;没写声明,只写实现,子类和父类就要没有定义相同的成员变量,只是重写了父类方法而已。
嘿嘿,希望对你有用~
回复 使用道具 举报
bao9107 发表于 2014-3-17 15:26
“假如我的HaBa这个类我没有类的申明!只有实现!就不会报错!!!”
对于这个问题,我先描述一下你一开始 ...

在xcode里仿真,能看的见用HaBa这个类创建的对象会有两个完全一样的成员变量,一个在父类里,一个在子类里。而且那个_age是@public类型的,两个都是。
回复 使用道具 举报
这问题,是因为语言的特性吧,一般情况下是不会包含.m文件的
回复 使用道具 举报
chain 中级黑马 2014-6-17 20:38:36
7#
首先,OC中子类和父类肯定是不能拥有相同成员变量的,所以你既然声明了HaBa这个类,并且子类拥有和父类相同的成员变量,肯定报错,但是如果只有类的实现,并且在实现中声明成员变量,此时成员变量的类型是@private类型,只能在当前类也就是子类中才有效,所以不会报错,此时两个成员变量作用域是不一样的
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马