iOS开发之oc(三)--继承、self/super的使用

面向对象的三大特性

1)封装(set方法和get方法,掌握

2)继承(掌握)

3)多态(理解概念即可)

 

(一)继承(一种语法):是用在类与类之间,代表(两个)类之间的关系.(OC是单继承

1.继承的使用场合

想要获取得某个类所有成员变量和方法,要实现什么,就通过继承.

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

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

继承的好处

 1> 抽取重复代码,提高了代码复用率

 2> 建立了类之间的关系

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

 继承的坏处

代码的耦合性强(就是类与类之间的联系)

>注意点:基本上所有类的根类是NSObject

2.

 继承要点

 1)当调用方法时,首先检测子类有没有实现这个方法,如果子类没有实现,就会调用父类的实现

 2)重写:子类实现父类中声明的方法

 3)子类里面声明的成员变量 和 父类里面声明的成员变量 不能同名 

 

 

代码示例:

1.

#import <Foundation/Foundation.h>

// 抽取一个公共类
@interface Animal : NSObject

{
    int _weight;
}
- (void) setWeight:(int)weight;
- (int) weight;
- (void)eat;

@end

@implementation Animal

- (void) setWeight:(int)weight
{
    _weight = weight;
}
- (int) weight
{
    return _weight;
}
- (void)eat {
    NSLog(@"吃吃吃-体重:%d", _weight);
}

@end

// Bird的声明
// 这里是冒号 : 代表继承
// Bird继承了Animal,就能拥有Animal的所有方法和成员变量
// Animal是Bird的父类(超类 superclass)

@interface Bird : Animal
@end

// Bird的实现

@implementation Bird
@end

// Dog的声明
// Dog继承了Animal,就能拥有Animal的所有方法和成员变量
// Animal是Dog的父类(超类 superclass)

@interface Dog : Animal
@end
// Dog的实现
@implementation Dog
@end

// Bird、Dog都是Animal的子类(subclasses)

int main()
{
    Dog *dog = [Dog new];
    [dog setWeight:100];
    [dog eat];
    
    return 0;
}

 

2.注意:

/*

就近原则
 重写:子类重新实现父类的某个方法,会覆盖父类以前的做法
 NSProxy和NSObject
 isa
 所有继承至NSObject对象,都有isa指针(是声明在NSObject中),指向它对应的类
 */

/*
 1.重写:子类重新实现父类中的某个方法,覆盖父类以前的做法
 2.注意
 1> 父类必须声明在子类的前面
 2> 子类不能拥有和父类相同的成员变量
 3> 调用某个方法时,优先去当前类中找,如果找不到,去父类中找
 
 2.坏处:耦合性太强(即类之间的关系太强,你离不开我,我离不开你,把某个类删掉后,就不能用了)
 */

#import <Foundation/Foundation.h>

@interface Person : NSObject     //  冒号表示继承关系,后面跟的是父类

@end

l   父类\超类 superclass

l   子类 subclass\subclasses

 

(二)super、self使用

1.self的使用

1)

self:接受消息的对象或类,当前对象的指针 (指向 方法调用者)。   注意: 在类方法中,self一定指向类

super:接受消息的对象的父类,用于调用父类的成员方法。

出现的地方:所有的OC方法中(对象方法\类方法),不能出现在函数

 2)作用

 1> 使用 "self->成员变量名" 访问当前方法调用的成员变量

 2> 使用 "[self 方法名];" 来调用方法(对象方法\类方法)

代码示例:

/*
 self
 1.使用场合:只能用在方法(对象方法\类方法),不能用在函数中
 2.每次调用方法的时候,系统会自动创建self指针
 3.self指针指向方法调用者
 */

#import <Foundation/Foundation.h>

@interface Car : NSObject
{
    int _wheels;
}

- (void)setWheels:(int)wheels;
- (int)wheels;

- (void)run;

@end

@implementation Car

// 所有的成员变量(不管是不是@public),都能直接在对象方法中访问

- (void) setWheels:(int)wheels
{
    self->_wheels = wheels;
}

- (int) wheels
{
    return self->_wheels;
}

- (void) run
{
    // self是一个特殊的指针,只在@implementation的方法中才有
    // self其实是方法中一个内置指针,每次调用方法,都会有self这个指针
    // self指针指向方法调用者
    int _wheels = 10;
    
    // 利用self指针访问方法调用的成员变量_wheels
    NSLog(@"%i个轮子的车子飞奔起来了!", self->_wheels);
}


/*
 错误写法:self不能用在函数中
void test()
{
    self->_wheels = 10;
}
 */

@end

int main()
{
    Car *c = [Car new];
    [c setWheels:4];
    
    [c run];
    
    return 0;
}

 

2.super的使用

作用

 1)直接调用父类中的某个方法。

 2)super处在对象方法中,那么就会调用父类的对象方法。

      super处在类方法中,那么就会调用父类的类方法。

 3)使用场合:子类重写父类的方法时想保留父类的一些行为。

 

思想:对于一些相同的属性,一般抽取一个公共类。

  

 

posted @ 2015-02-24 12:54  timo1234  阅读(501)  评论(0编辑  收藏  举报