继承就需要有父类和子类,子类拥有父类所有的成员变量和方法(类方法和对象方法),在创建子类时,这些成员变量和方法就不用再重复声明和实现,但方法可以重写。这就延伸了一些规范:
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 |
|