黑马程序员--类的三大特性(多态、继承、封装)

来源:互联网 发布:数据库封装统一接口 编辑:程序博客网 时间:2024/06/05 14:12

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

/*
多态
1.没有继承就没有多态
2.代码的体现:父类类型的指针指向子类对象
3.好处:如果函数或方法变量参数中使用的是父类类型,可以传入父类、子类对象
4.局限性:
1》父类类型的变量 不能 直接调用子类特有的方法,必须强转为子类类型变量后,才能直接访问子类特有的方法

*/

#import <Foundation/Foundation.h>@interface Animal : NSObject- (void)eat;@end@implementation Animal- (void)eat{    NSLog(@"吃东西----");}@end@interface Dog : Animal@end@implementation Dog- (void)eat{    NSLog(@"Dog吃东西----");}@endint main(){    Dog *d = [Dog new];//dog 类型    // 多态:父类指针指向子类对象    Animal *a = [Dog new];    //多态的局限性:父类类型的变量 不能用来调用子类的方法    Dog *dd = (Dog *)aa;//int a = (int)1.09 强制转换    [a eat];    //调用的是Dog里面的方法 eat,但不能这么用    return 0;}

/*
继承的适用场合
1》当两个类拥有相同的属性和方法的时候,就可以将相同的东西抽取到一个父类中
2》当A类完全拥有B类部分属性和方法是,可以考虑让B类继承A类(不一定)
****student 可以继承 person student和score 只能组合
例如:

@interface Student : NSObject {    Score *_score;    int _age;               //[super walk]调用父类方法walk }                          super作用:直接调用父类中的某个方       法和self想似

继承的好处:
1》抽取重复代码
2》简历了类之间的关系
3》子类可以拥有父类中的所有成员变量和方法
2.注意点
1》基本上所有的根类是NSObject
*不允许子类和父类有相同的成员变量(方法可以一样)
*父类必须声明在子类的前面
*就近原则
坏处
耦合性:之间联系太强
*/

#import <Foundation/Foundation.h>//****Animal的声明******@interface Animal : NSObject{    int _age;    double _weight;}- (void)setAge:(int)age;- (int)age;- (double)setWeight:(double)weight;- (double)weight;@end//Animal的实现********************@implementation Animal- (void)setAge{    _age = age;}- (int)age{    return _age;}- (double)setWeight:(double)weight{    _weight = weight;}- (double)weight{    return _weight;}@end//********Dog*******//: Animal 继承了Animal,相当于拥有了Animal里面的所有的成员变量和方法// Animal称为Dog的父类// Dog称为Animal的子类@interface Dog :Animal@end@implementation Dog@end//******CAT*********8@interface Cat :Animal@end@implementation CAT@endint main(){    Dog *d = [Dog new];    [d setAge:10];    NSLog(@"age=%d", [d age]);    return 0;}

封装

#import <Foundation/Foundation.h>@interface Student : NSObject//只允许外界访问,不允许修改 值提供get方法{   //成员变量尽量不要使用@public    // @public    int _age;成员变量的命名规范:一定要以下划线 _ 开头}/*set 方法 1.作用:提供一个方法给外界设置成员变量值 2.命名规范: 1》方法名必须以set开头 2》set 后面跟上成员变量的名称,成员首字母必须大写 3》返回值一定是void 4》一定要接受一个参数,而且参数类型一定要跟成员变量一致 5》形参的名称不能与成员变量名一样 */- (void)setAge:(int)Age;- (void)study;/*get方法 1.作用:返回对象内部的成员变量 2命名规范: 1》肯定又返回值,返回值肯定与成员变量类型一致 2》方法名与成员变量名一样 3.》不需要接受任何参数 */- (int)age;@end@implementation Student//set方法的实现- (void)setAge:(int)newAge{    //对传进来的参数进行过滤    if (Age <= 0)    {        Age = 1;    }    _age = Age;}- (void)study{    NSLog(@"%d岁的学生在学习",age);}- (int)age{    return _age;}@endint main(){    Student *stu = [Student new];    [stu setAge:10];    //[stu study];    NSLog(@"学生的年龄是%d岁",[stu age]);    return 0;}
0 0
原创粉丝点击