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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 池莉娘子 中级黑马   /  2015-6-29 21:43  /  904 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

继承就需要有父类和子类,子类拥有父类所有的成员变量和方法(类方法和对象方法),在创建子类时,这些成员变量和方法就不用再重复声明和实现,但方法可以重写。这就延伸了一些规范:
1 不允许子类再定义与父类相同的成员变量
2 方法的重写:子类重新实现父类的方法,是实现,而不是声明,这种重新实现多是用来创建一些子类特有的行为
3 方法的调用,优先从子类开始寻找,然后一级一级向父类寻找
继承的格式          @interface Car : NSObject       //这就表明Car继承了NSObject类
                              @end
具体考虑继承时,有下面两种情况
1 当两个或多个类有相同的成员变量和方法时,我们可以抽取这些相同的部分,来创建一个他们共同的父类
2 当 一个类拥有另一个类的部分成员变量和方法时,前者就可以作后者的父类
继承也是有坏处的,那就是耦合性太强。所谓耦合性简单来说,就是子类父类关系太紧密,删除父类时,子类就无效了
程序演示:
#import<Foundation/Foundation.h>
/*一个动物类
猫和狗都继承这个类
*/
//动物类是父类,狗类和猫类是子类
//动物类的声明
@interface Animal : NSObject
{              //不要括号也行
    int _age;
    double _weight;//成员变量都是下划线开头
}
- (void)setAge:(int)age;
- (int)age;

- (void)setWeight:(int)weight;
- (int)weight;

+ (void)run;
@end
//动物类的实现
@implementation Animal
- (void)setAge:(int)age
{
    _age=age;
}
- (int)age
{
    return _age;
}

- (void)setWeight:(int)weight
{
    _weight=weight;
}
- (int)weight
{
    return _weight;
}
+ (void)run
{
    NSLog(@"跑跑跑!");
}
@end

//狗类的声明
@interface Dog : Animal             //继承Animal,拥有了Animal里面所有的成员变量和方法
@end
//狗类的实现
@implementation Dog
@end

//猫类的声明
@interface Cat : Animal                //继承Animal,拥有了Animal里面所有的成员变量和
方法
@end
//猫类的实现
@implementation Cat
//方法的重写
+ (void)run
{
    NSLog(@"猫跑跑跑!");
}
@end


int main()
{
    Cat *c = [Cat new];
    [c setWeight:20];                //set方法的调用
    double a = [c weight];   //get方法的调用
    [Cat run];            //调用的是猫类里的run方法。因为它先在猫类里找有没有run方法,有就调用,没有就去父类Animal里面找
    NSLog(@"猫的体重是%f",a);
return 0;
}

继承不适合的场合
         举例说明:猫类里面有成员变量age和weight,人类里也有这两个属性,外加一个name属性,我们能让猫继承人吗?
显然这是不符合人的逻辑的,这种场合虽然语法不报错,但是时不允许的。
组合
      显然上面那种场合是不适合继承的,那就考虑使用组合。
      组合:类中有其他的类
@interface Person : NSObject
{
Cat *c;               //这样就是组合
}  
@end
@implementation Person
@end

3 个回复

倒序浏览
还没学到OC的继承部分,先看看了~
回复 使用道具 举报
我也刚看到这里
回复 使用道具 举报
学习了,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马