------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
**继承:
建立两个类:一个狗 一个猫,属性相同。 继承以后 狗和猫都同时拥有了Animal的属性和方法
// animal类的建立
#import <Foundation/Foundation.h>
@interface Animal : NSObject
{
int _age;
double _weight;
}
- (void)setAge:(int)age;
- (int)age;
- (void)setWeight:(double)weight;
- (double)weight;
@end
@implementation Animal
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
- (void)setWeight:(double)weight
{
_weight = weight;
}
- (double)weight
{
return _weight;
}
@end
// 狗类的建立
@interface Dog : Animal /*这个冒号后就是继承 冒号要是英文的 NSObjict就是一个类。Animal成为dog和cat的父类 dog<span style="white-space:pre"> </span>和cat是Animal的子类。*/
@end
@implementation Dog
@end
// 猫类的建立
@interface Cat : Animal
@end
@implementation Cat
@end
int main()
{
Dog *d = [Dog new]; //new 也是一个类方法 他是存在于NSObiect中的。
[d setAge:10];
NSLog(@"age = %d", [d age]);
return 0;
}
继承的好处:
1、抽取重复代码
2、建立了类之间的关系
3、子类可以拥有父类中的所有成员变量和方法
注意点:
1、基本上所有类都继承NSObiect 这个基本类
2、不允许子类和父类拥有相同名称的成员变量
3、父类必须“声明”在子类前面(实现可以在后) 。
4、子类可以“重写”实现父类中的某个方法,调用时遵循就近原则。(可以有一样的方法名。而且父类中只有声明,子类来实现也可以)
5、耦合性太强,相互依赖型强。
继承的使用场合:
1、当两个类拥有相同属性和方法时,就可以将相同的东西抽取到一个父类中。
2、当A类拥有B类部分属性和方法时,可以考虑让B类继承A类。两个是同一类的才考虑继承。如果不是同一类可以考虑组合,如下:
如果一个类想拥有另一个类的属性方法,可以考虑继承和组合
继承:xxx是xxx 例,学生是人
组合:xxx拥有xxx 学生拥有成绩
组合
@interface Score : NSObiect
{
int _cScore;
int _ocScore;
}
@end
@implementation Score
@end
@interface Student : NSObject
{
Score *_score; // 学生拥有了成绩
int _age;
}
@end
@implementation Student
@end
继承的关键字:super
[super 方法名];
1、调用父类中的某一方法
2、如果super处在对象方法中,就调用父类的对象方法。
如果super处在类方法中,那么就调用父类的类方法
使用场合:子类重写父类方法时,想保留父类的一些行为
父类:僵尸 子类:跳跃僵尸、铁通僵尸、舞王僵尸
<span style="font-size:18px;">#import <Foundation/Foundation.h>
@interface Zoobie : NSObject
- (void)walk;
@end
@implementation Student
- (void)walk
{
NSLog(@"向前走两步");
}
@end
@interface JumpZoobie : Zoobie
@end
@implementation Student
- (void)walk // 因为跳跃僵尸的走和普通僵尸不一样,所以重写
{
NSLog(@"跳两下");
NSLog(@"向前走两步");</span>
<span style="font-size:18px;">/* 也可以用父类方法代替,但[self walk];是调用自己的方法,所以用[super walk];调用父类的方法,用[super walk];代替这一句代码。。super调用类方法也是这样。*/
}
@end
int main()
{
JumpZoobie *jz = [JumpZoobie new];
[jz walk];
return 0;
}</span><span style="font-size:24px;">
</span>
多态:多种形态
1、没有继承就没有多态
2、代码的体现:父类类型的指针指向子类对象
3、好处:如果函数/方法参数中使用的是父类类型,可传入子类类型、父类类型的对象
4、局限性:父类类型的变量不能直接调用子类特有的方法。要是想调用必须强制转为子类类型变量后,才能直接调用。
例如:
#import <Foundation/Foundation.h>
@interface Animal : NSObject
- (void)eat;
@implementation Animal
- (void)eat
{
NSLog(@"吃吃吃");
}
@end
@interface Dog : Animal
@end
@implementation Dog
- (void)eat
{
NSLog(@"狗吃吃吃");
}
@end
void feed(Animal *a)
int mian()
{
Dog *d = [Dog new]; // Dog型
// 多态。父类指针指向子类对象.。也是dog型,和上面的一行一样作用
Animal *a = [Dog new]; // 父类指针一般不能用来调用子类方法
[a eat]; // 输出是“狗吃吃吃”
Dog *d = (Dog *)a; // 强制转换类型。
[d run];
// 如果要猫吃、狗也吃则可以这样
feed(d);
Cat *c = [Cat new];
feed(c); <span style="white-space:pre"> </span>// 这就是多态的好处,如果不这样写,就要定义两个函数分别表示猫狗吃
return 0;
}
@interface Cat : Animal
@end
@implementation Cat
- (void)eat
{
NSLog(@"猫吃吃吃");
}
@end
void feed(Animal *a)
{
[a eat];
}