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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© bubuatt 中级黑马   /  2014-4-18 09:11  /  1389 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 bubuatt 于 2014-4-18 17:09 编辑

父类person中定义了方法
  1. + (id)person
  2. {
  3.     return [[[self alloc] init] autorelease];
  4. }

  5. + (id)personWithAge:(int)age
  6. {
  7.     Person *p = [self person];
  8.     p.age = age;
  9.     return p;
  10. }
复制代码


子类在调用时
  1. int main(int argc, const char * argv[])
  2. {
  3.     @autoreleasepool {
  4.         GoodPerson *p = [GoodPerson personWithAge:10];
  5.         p.money = 100;
  6.     }
  7.    
  8.     return 0;
  9.    
  10.    
  11. }
复制代码

  1. Person *p = [self person];
复制代码

这句为什么不用GoodPerson *p = [self person];(这句会报错)

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

3 个回复

正序浏览
Person *p = [self person]; 这句话技能创建一个Person对象,也能使Person的子类调用返回一个子类的对象。
如果改成GoodPerson那么,只能子类GoodPerson调用,Person和他的其他子类就用不了了。
回复 使用道具 举报
使用self调用类方法或对象方法,self指向的是调用方法本身的类或对象,使用这个方法首先要有指向的类或对象,GoodPerson *p = [self person];这句代码中的self没有所指的类或对象,所以这样写是不对的。

评分

参与人数 1黑马币 +2 收起 理由
jing迪 + 2

查看全部评分

回复 使用道具 举报
这句当然不能用GoodPerson *p = [self person];,首先GoodPerson 是子类,你在父类对象中又没有子类对象的声明,所以不能在父类中使用。


[GoodPerson personWithAge:10];是子类对象调用父类中的方法,子类继承父类,所以子类对象拥有父类对象的全部方法。。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马