黑马程序员——组合与super关键字

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

.继承的坏处:耦合性太强,删掉父类时子类就不能成功运用了。

继承适用的场合:
 1>当两个类拥有相同属性和方法时,就可以将相同的东西抽取到一个父类中
 2>当A类拥有B类中的部分属性和方法时就可以考虑让B类继承A类

#inport<Foundation/Foundation.h>

//声明
@interface Score:NSObject
{
 int _cScore;
 int _ocScore;
}
@end

@implementation Score
@end

@interface Student:NSObject
{
 int _cScore;
 int _ocScore;
 int _age;
}
@end

@implementation Student
@end


A:                            B:
{                             {
 int _age;                int _age;       
 int _weight;                    int _weight;
}     int _no;
    }


//继承                         //组合
B:A                            B:NSObjct
{                               {
 int _no;                         A *_a;
                                         int _no;
}                                }


3>但若成左边的类 语法上Student:Score可以,但实际上很别扭,学生继承成绩。不舒服,所以这时就不用继承,
 要用组合。将Student的声明变为:

@interface Student:NSObject
{
 Score *_score;
 int _age;
}
@end

//继承是:××是×××
//组合是:××拥有×××

显然是Student拥有Score,Student是Person
所以,该用继承还是组合,套上边的话,适合哪句用哪个。

2.super

僵尸:跳跃僵尸、舞王僵尸、铁通僵尸

#inport<Foundation/Foundation.h>

//声明
@interface Zoombie :NSObject

-(void)test;
-(void)walk;
+(void)test;

@end

@implementation Zoombie
//方法的实现

-(void)test
{
 NSLog(@"走两步");
}
-(void)walk
{
 
 NSLog(@"-test");
}
+(void)test
{
 
 NSLog(@"+test");
}

@end

@interface JumpZoombie :Zoombie

-(void)haha2;
+(void)haha;

@end

@implementation Zoombie
//方法的实现

-(void)haha2
{
 [super test];
}
+(void)haha
{
 [super test];
}
-(void)walk
{
 
 NSLog(@"跳两下");
 NSLog(@"走两步");
}

@end

int main()
{
 JumpZoombie *jz = [JumpZoombie new];
 [jz walk];
 return 0;
}

 

输出结果:跳两下
   走两步

因为题中子类的walk中用到了父类的内容,一般会想到用[self walk];
但这样self相当于子类walk,死循环,所以这时需要另一个指针,指向父类
将子类JumpZoombie中walk方法改为:
-(void)walk
{
 
 NSLog(@"跳两下");
 [super walk];
}
这样就会调用父类中的walk,会有同样的输出结果。

当把main函数改为
int main()
{
 [JumpZoombie haha];
 return 0;
}
时,会调用子类中的+(void)haha方法,此时super代表父类中的类,所以[super test]
须调用父类中的test方法+(void)test,所以输出+test

当改为:

int main()
{
 JumpZoombie *jz = [JumpZoombie new];
 [jz haha2];
 return 0;
}
时,会调用子类中的haha2对象方法,此时super代表父类中的对象,所以[super test]
需调用父类中的test对象方法,-(void)test,所以输出-test

总结:
    super作用:
 1.直接调用父类中的某个方法
 2.super处在对象方法中,那么就会调用父类的对象方法
   super处在类方法中,那么就会调用父类的类方法
 3.适用场合:子类重写父类的方法时想保留父类的一些行为


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值