------<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.适用场合:子类重写父类的方法时想保留父类的一些行为