1、继承的好处:
1.1 继承可以抽取重复的代码,减少代码量,提高代码的利用性
1.2 面向对象的多态就是基于继承
1.3 继承建立了类与类之间的关系
1.4 子类可以拥有父类中的所有成员变量和方法
1.5 当子类想要拥有和父类同名但是不一样的实现方式时,可以重写父类的方法,提高代码的灵活性
2、继承的声明
2.1 声明和实现父类方法 :@interface Animal:NSObject @end
2.2 声明子类,并在声明子类后面继承父类:@interface Dog:Animal @end
3、方法的重写
3.1 子类重新实现父类的某个方法,覆盖父类以前的做法
3.2 父类必须声明在子类的前面
3.3 子类不能拥有和父类相同的成员变量
3.4 调用某个方法时,优先在当前类中找;如果找不到,再到父类中找
4、继承的坏处
4.1 类与类之前的偶合性太强
5、继承的使用场合(继承与组合)
5.1 继承表示的是A类属于B类,即A:B,或者A is B。当A是B的子集时,可以采用继承的方式。比如狗是动物的一种,Dog is Animal,即可声明为@interface Dog:Animal
5.2 当A类不是B类的子集时,但是B类又需要拥有A类的部分属性或方法,这时可以考虑使用组合的方式。组合表示的是B类拥有A类,即B has A。如学生类拥有成绩类,即可用组合的方式。具体做法为声明成绩类和学生类。在学生类中声明一个成绩类的成员变量,即表示学生类拥有成绩类了。
#import <Foundation/Foundation.h>
@interface Animal:NSObject
{
int _age;//年龄
double _weight;//重量
}
- (void)setAge:(int)age;
- (int)age;
- (void)setWeight:(double)weight;
- (double)weight;
//对象方法:跑
- (void)run;
//类方法:test
+ (void)test;
@end
//Animal类的实现
@implementation Animal
- (void)setAge:(int)age
{
_age=age;
}
- (int)age
{
return _age;
}
- (void)setWeight:(double)weight
{
_weight=weight;
}
- (double)weight
{
return _weight;
}
- (void)run
{
NSLog(@"Animal---跑");
}
+ (void)test
{
NSLog(@"Animal---+test");
}
@end
@interface Dog : Animal
//子类不能拥有和父类相同名称的成员变量
//int _age;
- (void)run;
+ (void)test2;
@end
@implementation Dog
//重写父类方法:子类重新实现父类中的某个方法,覆盖父类以前的方法
- (void)run
{
NSLog(@"dog's running");
}
/*
//如果这一段没有注释的话,则下面的test2方法调用的是当前的test方法
+ (void)test
{
NSLog(@"dog-----+test");
}
*/
+ (void)test2
{
//调用当前类的类方法,如果没有则到父类中查找test类方法
[self test];
}
@end
@interface Cat:Animal
@end
@implementation Cat
@end
int main()
{
Dog *d= [Dog new];
[d setAge:10];
NSLog(@"dog's age=%d",[d age]);
//调用对象方法run
[d run];
//调用类方法test2
[Dog test2];
return 0;
}