一、继承
1.使用继承可以使得子类拥有父类的所有成员变量和方法
2.继承的子类不可以重新定义和父类名称相同的成员变量
3.子类重新实现父类中的方法,称之为重写
4.当调用某个方法时,优先在子类中寻找,如果子类没有定义该方法,就去父类中寻找
5.继承缺点是:耦合性强
继承可以抽取重复的代码,建立类之间的相互关系,使得代码更简洁,设计更合理。例子代码如下:
#import <Foundation/Foundation.h>
//声明对象的属性和行为
@interface Car : NSObject
{
int _wheels;
int _speed;
}
//wheels的set方法
- (void)setWheels:(int)wheels;
//wheels的get方法
- (int)wheels;
//speed的set方法
- (void)setSpeed:(int)speed;
//speed的get方法
- (int)speed;
- (void)drive;
+ (void)test;
@end
//实现类
@implementation Car
//set方法
- (void)setWheels:(int)wheels
{
if(wheels <= 0)
{
self->_wheels = 1;
}
self->_wheels = wheels;
}
//get方法
- (int)wheels
{
return self->_wheels;
}
//speed的set方法
- (void)setSpeed:(int)speed
{
if (speed <= 0) {
speed = 1;
}
_speed = speed;
}
//speed的get方法
-(int)speed
{
return _speed;
}
- (void)drive
{
NSLog(@"汽车在行驶---");
}
+ (void)test
{
NSLog(@"测试super的使用");
}
@end
//定义Jeep类
@interface Jeep : Car
- (void)drive;
+ (void)test;
@end
//实现Jeep类
@implementation Jeep
- (void)drive
{
NSLog(@"Jeep在行驶---");
}
+ (void)test
{
NSLog(@"Jeep在行驶+");
[super test];
}
@end
//定义Benz类
@interface Benz : Car
- (void)drive;
+ (void)test;
@end
@implementation Benz
- (void)drive
{
NSLog(@"Benz在行驶---");
}
+ (void)test
{
NSLog(@"Benz在行驶+");
[super test];
}
@end
int main()
{
Jeep *j = [Jeep new];
[j setWheels:10]; //子类可以拥有父类的方法
[j setSpeed:1000];
NSLog(@"车子有%d个轮子,速度为%d",[j wheels],[j speed]);
[j drive];
Benz *b = [Benz new];
[b setWheels:23];
[b setSpeed:139];
NSLog(@"车子有%d个轮子,速度为%d",[b wheels],[b speed]);
[b drive];
//super的使用 和类方法的使用 例子
[Jeep test];
[Benz test];
return 0;
}
运行结果为:
二、多态
多态是基于继承的基础之上的,多态可以使得父类的指针指向子类的对象
如果函数或参数中使用的是父类类型,可以传入父类、子类对象,但是父类类型的变量不能直接调用子类特有的方法
具体的实现代码可以在上面继承的代码上加入:
//多态的例子声明的方法
void run(Car *c)
{
[c drive];
}
int main()
{
Jeep *j = [Jeep new];
[j setWheels:10]; //子类可以拥有父类的方法
[j setSpeed:1000];
NSLog(@"车子有%d个轮子,速度为%d",[j wheels],[j speed]);
[j drive];
Benz *b = [Benz new];
[b setWheels:23];
[b setSpeed:139];
NSLog(@"车子有%d个轮子,速度为%d",[b wheels],[b speed]);
[b drive];
//super的使用 和类方法的使用 例子
[Jeep test];
[Benz test];
//多态的使用
Car *c = [Jeep new];
[c drive];
run(b);
return 0;
}
运行结果: