黑马程序员—03OC三大特征

来源:互联网 发布:js中获取json对象的值 编辑:程序博客网 时间:2024/06/07 17:23

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


一、继承

1> 继承定义

继承 :假如已经定义一个类,而另外一个类有这个类的所有成员变量和方法,并且,这两个类的关系是从属关系,比方说:动物->狗;动物->人类->学生->小学生,因为狗有动物的属性和方法,所以狗可以继承动物,小学生有学生的属性和方法,学生有人类的属性和方法,人类有动物的属性和方法,所以小学生可以继承学生可以继承人类可以继承动物。


2> 重写、组合

* 重写 :子类继承了父类,如果,父类的某些方法对于子类不太合适,那么,子类就可以用父类同样的方法名称再实现一个适合自己的方法,就这样子类覆盖父类的方法,这就是重写,在方法调用中,优先调用子类的方法,然后是父类,以此类推。

* 组合 :与继承情况类似,假如已知一个类,如果另外一个类有这个类的所有的成员变量和方法,但是,这两个类又不是从属关系,仅仅是包含而已,比方说:成绩单和学生信息,学生信息里包括成绩单,但是成绩单并不是学生的子类。那么这种场合用组合。


3> 举例

继承的实例 :

/********Animal的声明*******/@interface Animal : NSObject{    int _age;    double _weight;}- (void)setAge:(int)age;- (int)age;- (void)setWeight:(double)weight;- (double)weight;@end/********Animal的实现*******/@implementation Animal- (void)setAge:(int)age{    _age = age;}- (int)age{    return _age;}- (void)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</span>

重写的实例 :

@interface Person : NSObject{    int _age;}- (void)run;@end@implementation Person- (void)run{    NSLog(@"person---跑");}@end@interface Student : Person@end@implementation Student// 重写:子类重新实现父类中的某个方法,覆盖父类以前的做法- (void)run{    NSLog(@"student---跑");}@end


组合的实例 :

@interface Score : NSObject{    int _cScore;    int _ocScore;}@end@implementation Score@end@interface Student : NSObject{    // 组合    Score *_score;//    int _cScore;//    int _ocScore;    int _age;}@end@implementation Student@end</span>


4> 总结

继承的好处 :

* 抽取重复代码。

* 建立了类之间的关系。

* 子类可以拥有父类中的所有成员变量和方法。


继承的局限性 :

* 耦合性。


注意点 :

* 基本上所有类的根类是NSObject。

* 不允许子类和父类拥有相同名称的成员变量。


继承的使用场合 :

* 当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中。

* 当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类。


Super :

* 概念 :在子类中重写方法时,可以让调用者跳过这一层而调用父类中的方法。

* 作用 :直接调用父类中的某一个方法;Super处在对象方法中,那么就会调用父类的对象方法。

* 使用场景:子类在重写父类方法时,想要保留父类的一些行为。



二、封装

1> 定义

封装是对象和类概念的主要特性。它是隐藏内部实现,稳定外部接口,可以看作是“包装”。 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。


2> 两个典型的类方法

* set方法 :为了设置成员变量的值,我们需要提供一个方法给外界,让外界设置成员变量的值,可以对方法里的参数进行过滤。

* get方法 :为了返回对象内部的成员变量,我们需要提供一个方法给外界,用来返回对象内部的成员变量。


3> 举例

@interface Person :NSObject{int _age;}- (void)setAge :(int)newAge; // set方法的声明- (int)age; // get方法的声明@end@implementation Person- (void)setAge :(int)newAge // set方法的实现{newAge = _age;}- (int)age // get方法的实现{return _age;}@end


4> 总结

封装的好处:使用更加简单,变量更加安全,可以隐藏内部实现细节,开发速度加快。

继承的实现 :在接口中使用符号“:”,例如  @interface Student: NSObject{ }

注意:属性封装了实例变量,方法封装了具体的实现代码, 类封装了属性和方法。子类可以继承父类中的方法,还可以重写(override)父类的方法。


类方法

加号 开头

只能由类(名)来调用

类方法中不能访问成员变量(实例变量)类方法的好处:不依赖于对象,执行效率高类方法的。

可以允许类方法和对象方法同名,当使用类调用方法时,会调用带+号的该方法;而使用对象调用方法时,会调用带-号的方法。

使用场合:能用类方法,尽量用类方法。当方法内部不需要使用到成员变量时,就可以改为类方法。


Self的用途:

* Self是一个指针,谁调用了当前方法,self就指向谁。(出现在对象方法中,就代表着当前对象,出现在类方法中,就代表着当前类)

* [self 方法名];可以调用其他的对象方法或者是类方法。

可以利用self->成员变量名访问当前对象内部的成员变量(仅在对象方法中)

当然啦,使用self应当注意,小心发生下面的死循环!!

(void)test{    NSLog(@"调用了-test方法");        // 会引发死循环    //[self test];}+ (void)test{    NSLog(@"调用了+test方法");        // 会引发死循环    //[self test];}

三、多态

1> 多态

* 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态。

* 在使用多态是,会进行动态检测,以调用真实的对象方法。

* 多态在代码中的体现即父类指针指向子类对象。


2> 多态的局限性

* 父类类型的变量不能直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法/父类指针可以指向子类对象。


3> 举例

Animal *c = [Cat new];NSObject *n = [Dog new];NSObject *n2 = [Animal new];Dog *d = [Dog new]; // Dog类型Animal *a = [Dog new];//多态:父类指针指向子类对象[a eat];//调用方法时会检测对象的真实形象
下面是利用多态创建字符串,感受一下:

#import <Foundation/Foundation.h>int main(){    // 最简单的创建字符串的方式    NSString *str = @"itcast";    // length方法算的是字数    int size = [str length];    NSLog(@"%d", size);//输出str的长度        // 创建OC字符串的另一种方式    NSString *newStr = [NSString stringWithFormat:@"My age is %d and no is %d and name is %@", 23, 666, str];    NSLog(@"---- %ld", [newStr length]);    return 0;}



4> 总结

没有继承就没有多态

* 代码的体现:父类类型的指针指向子类对象

* 好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了。

* 局限性:父类类型的变量不能直接调用子类特有的方法,如果必须要调用,则必须强制转换为子类特有的方法。




0 0
原创粉丝点击