OC面向对象的三大特性



三大特性:

封装,继承,多态


封装:

当类中的属性加 @public 为公共对象是 传入的实参可能是不合理的,这时可以提供一个方法给外界设置属性值,这种方法一般叫做set方法。

set方法: 提供一个方法给外界设置成员变量

声明:(规范) 方法名必须以set开头 后面跟成员变量的名称,首字母必须大写;返回值一定是void,一定要接受一个参数 类型必须和成员变量一致 形参的名称不能和成员变量一样

- (void)setAge:(int)newAge;

get方法:访问成员变量的值

声明:(规范)方法名跟成员变量名一致  肯定有返回值,与成员变量的类型一致,不需要就收任何参数

- (void)age 

- (void)age {

return age;

}

封装的作用: 保证数据的安全,隐藏细节 一些值对于外界是只读的,不可修改只用get方法达到只读的特性



self: self是一个指针,指向当前调用对象,谁调用这个方法就指向谁对于类方法也适用

1   当方法内有重名时 如果希望访问类中的成员变量,用self

2    [self  对象方法] 

@interface Person NSObject

{

int  _age

}

@end

@implementation Person

- (void)test{

int  _age=20

//这时NSLog访问的age是成员变量中的_age

NSLog(@"%d",self->_age)

}

@end

//调用这个方法时用self会先执行调用对象的bark方法

- (void) run {

[self bark];

}

继承:继承另一个类中所有的成员变量和方法

作用:

1抽取重复代码

2建立了类之间的联系

注意:1比本上所有的根类都是NSObject

   2 父类写在最上面

   3调用方法时会优先子类中的方法如果没有再去找父类中的方法

           4子类重新实现父类中的某个方法叫做 重写 

  5耦合性太强

继承的适用场合:

1当两个类中有相同属性和方法时可以抽取到一个父类中

2当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A(需要符合代码设计逻辑)

//这里的NSObject就是继承 在冒号: 后面加要继承的类

@interface Animals : NSObject

//animals为Dog的父类

@interface Dog : Animals;

组合:也是为了达到继承的效果 ,为了设计逻辑的合理性可以使用组合

用法:

使用指针指向需要拥有的类

@interface Report:NSObject

@end

@implementation Report

@end

@interface  Student:NSObject

{

//组合的使用:student拥有Score

Score *_score

}

@end

组合与继承: 

继承:XX是XX

组合:XX拥有XX

多态 : 多种形态(没有继承就没有多态)

多态的作用如果参数中使用的是父类类型可以传入父类子类对象(利用父类的指针达到节省代码的作用)

多态的局限性:

不能用父类的指针变量调用子类的方法(可以执行但是不符合语法规范)

没有继承就没有多态

#import <Foundation/Foundation.h>

@interface Animal:NSObject

- (void)eat;

@end

@implementation Animal

- (void)eat {

    NSLog(@"Animal eat");

}

@end


@interface Dog : Animal

- (void)eat;

@end

@implementation Dog

- (void)eat {

    NSLog(@"Dog eat");

}

@end


@interface Cat : Animal

- (void)eat;

@end

@implementation Cat

- (void)eat {

    NSLog(@"Cat eat");

}

@end


//用来喂食

//多态的作用如果参数中使用的是父类类型可以传入父类子类对象

void feed(Animal *a){

    [a eat];

}


int main(int argc, const char * argv[]) {


    //多态父类指向子类对象

    //同理 NSObject *a=[Animal new]也是合理的

    Animal *d=[Dog new];

    //调用方法时会检测对象的真实类型 所以会优先执行Dog中的eat方法

    [d eat];

    

    //这样是不合理的 应为Cat没有继承Dog

  //  Cat *c=[Dog new];

    //同样是不合理的

  //  Cat *c1=[Animal new];

    

   //多态的作用如果参数中使用的是父类类型可以传入父类子类对象

    feed(d);

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值