2015-10-12 OC语言中的多态 以及面向对象方法和继承的相关问题总结

1.关于.h和.m文件:

.h 接口文件 .m 实现文件

 接口只是对类中的类属性和方法进行定义和声明 @interface

 @interface 类名 :(继承)NSObject

 实现负责类中的方法的具体实现的过程和属性的赋值 @implementation


2.封装安全性:

  @private 作用范围是:本身

   @protected 作用范围是:自身和子类

 @public 作用范围是:全部


3.类方法和对象方法的区别:

 类方法:+(返回值类型) 方法名称:(参数类型)参数

 注意:类方法不能设置类属性(实例变量)


 对象方法:-(返回值类型) 方法名称:(参数类型)参数

 对象方法才可以设置类属性

 注意:参数类型要一样


4.继承结论:

 (1)、子类继承父类,当都拥有相同的方法优先调用自己定义的方法

 (2)、即使子类没有定义这个方法,编译器会去父类找这个方法的声明,注意:但是具体方法的实现,还是优先找自己的实现的方法。

 (3)、如果直接调用父类的方法,而父类没有声明这个方法的时候,编译器不会去找子类,也就是会报错!


 继承可以实现,但是需要事先引用父类的头文件

 @interface 子类 :(继承) 父类

 子类继承父类,特性如下:

 (1)、可以使用父类的所有的方法

 注意:子类用父类的方法,需要用super,使用自己的方法用self,默认如果不用             关键字,先用自己的。

 (2)、可以使用父类的所有的属性


5.多态

一句话概括多态: 父类指针可以指向子类对象,也可以指向父类对象


具体实例

main.m

#import <Foundation/Foundation.h>

#import "Car.h"

#import "PassengerCar.h"

#import "Truck.h"


int main() {

   

    //实例化car对象,并设置相关值

    Car *car = [[Car alloc]init];

    [car setName:@"小汽车"];

    [car setWheelNumber:4];

    [car setSpeed:60];

    

    //实例化passengerCar对象,并设置相关值

    PassengerCar *passengerCar = [[PassengerCar alloc]init];

    [passengerCar setName:@"客车"];

    [passengerCar setWheelNumber:8];

    [passengerCar setSpeed:80];

    [passengerCar setSeatNumber:47];

    

    //实例化truck对象,并设置相关值

    Truck *truck = [[Truck alloc]init];

    [truck setName:@"货车"];

    [truck setWheelNumber:4];

    [truck setSpeed:60];

    [truck setTruckWeight:1000];

    

    

    [car describe:car];

    [passengerCar describet:passengerCar];

    [truck describes:truck];

    

//    //第二种情况调用

//    [car describe:car];

//    [car describe:passengerCar];

//

    //第三种情况调用

//    [passengerCar describes:car];

//    [passengerCar describes:passengerCar];


}


car.h

#import <Foundation/Foundation.h>

//#import "PassengerCar.h"


@interface Car : NSObject


{

    NSString * _name;

    int _wheelsNumber;

    int _speed;

    

}

-(void) setName :(NSString *) name;

-(NSString *) name;


-(void) setWheelNumber : (int) wheelsNumber;

-(int) wheels;


-(void) setSpeed : (int) speed;

-(int) speed;


//第一种情况,多态方法在父类中,传递参数类型是Car(父类)类型,此时调用时的对象可以是父类对象,也可以是子类对象。

-(void) describe : (Car *)car;


//第二种情况,多态方法在父类中,传递参数类型是Passenger(子类)类型,此时调用时的对象可以是父类对象,也可以是子类对象。

//-(void) describes : (PassengerCar *)passenger;

@end




car.m

#import "Car.h"


@implementation Car

-(void)setName:(NSString *)name

{

    _name = name;


}

-(NSString *)name

{

    return _name;

}


-(void)setWheelNumber:(int)wheelsNumber

{

    _wheelsNumber = wheelsNumber;

}


-(int)wheels

{

    return _wheelsNumber;

}


-(void)setSpeed:(int)speed

{

    _speed = speed;

}


-(int)speed

{

    return _speed;

}


-(void) describe : (Car *)car;


{

    NSLog(@"%@的轮子数是%i,车速是%i",_name,_wheelsNumber,_speed);

}

@end




passangerCar.h

#import <Foundation/Foundation.h>

#import "Car.h"


@interface PassengerCar : Car

{

    int _seatNumber;

}


-(void) setSeatNumber : (int) seatNumber;

-(int)seatNumber;



//调用父类的多态方法

-(void) describet : (Car *)car;

////第三种情况,多态方法在子类中,传递参数类型是Car(父类)类型,此时调用时的对象只能是子类对象。

//-(void) describes : (Car *) passengerCar;

@end



passengerCar.m

#import "PassengerCar.h"


@implementation PassengerCar

-(void)setSeatNumber:(int)seatNumber

{

    _seatNumber = seatNumber;

}

-(int)seatNumber

{

    return _seatNumber;

}


// 父类多态方法的调用,可输出子类和继承的父类的属性

-(void) describet : (Car *)car;


{

    NSLog(@"%@的轮子数是%i,车速是%i,座位数是%i",_name,_wheelsNumber,_speed,_seatNumber);

}


@end



truck.h

#import <Foundation/Foundation.h>

#import "Car.h"


@interface Truck : Car

{

    int _weight;

}


-(void)setTruckWeight : (int) weight;

-(int) weight;


//调用父类的多态方法

-(void) describes : (Car *)car;

@end



truck.m

#import "Truck.h"


@implementation Truck

-(void)setTruckWeight : (int) weight

{

    _weight = weight;

}

-(int) weight

{

    return _weight;

}


// 父类多态方法的调用,可输出子类和继承的父类的属性

-(void) describes : (Car *)car;


{

    NSLog(@"%@的轮子数是%i,车速是%i,载重量是%i",_name,_wheelsNumber,_speed,_weight);

}

@end










你可能感兴趣的:(2015-10-12 OC语言中的多态 以及面向对象方法和继承的相关问题总结)