黑马程序员——继承

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

<1>什么是继承?

继承是面向对象的一个核心概念。在Objective-C的继承体系中,位于最顶层的根类是NSObject,我们定义的所有类都是它的子类。子类也叫扩展类或派生类。

            实例:汽车类

            属性:speed,weight    
            方法:move ,load
            飞车:
            属性:speed,weight    ,flySpeed
            方法:move ,load,fly
#import <Foundation/Foundation.h>
//     核心:飞车本质是车的一种
//     拥有汽车类所有的属性和方法
//    飞车又不是普通的车,能飞在空中
//两种方式:<1>重写车的属性和方法 存在问题:代码的复用性太低(同样的代码有两份)  不好维护
#import"Car.h"
//<2> oc中的继承
//  定义了一个flycar ,这个类继承于car
//  称呼:子类,父类
//  特性:子类会拥有父类的属性和方法
@interface FlyCar : Car
//flycar类拥有父类car中的所有属性
//
//
{
    double _flyspeed;
}
-(void)fly;

@end
总结:
(1)oc中每个类都必须要有个父类。如果不知道要继承哪个类,那么就继承NSObject --->oc中的根类,其他类都会直接或者间接   的继承这个类
(2)oc中一个类能不能继承多个类(多继承)
         oc中一个类只能继承于一个类,不能继承于多个类
(3)init方法
          oc每个类只需要初始化自己的实例变量
 实现子类的时候,因为子类中包含了父类的实例  所以子类中一定执行了父类init方法
-(id)init
{
    //self是方法隐藏的参数
    //  self存储的是当前对象的地址
    //  car *car=[[Car alloc] init];
    //  实例方法中:self 的值就是car指针的值
    //self什么时候使用
    //  (1)调用当前类的方法 [self print];
    //  (2)使用property    self.name=@"xiaoli";
    //super是编译器的指示符
    //  表示父类
    //  用法:执行从父类继承下来的方法
    if (self =[super init]) {
        NSLog(@"car init");
    }
    return self;
}

继承的好处:
 1> 抽取重复代码
 2> 建立了类之间的关系
 3> 子类可以拥有父类中的所有成员变量和方法

继承的使用场合
 1> 当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中
 2> 当A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A类

<2>如何扩展一个类?如何复用已有的代码

1.NSMutableString 不存在reverseString
2.这个类不仅缺少方法,而且缺少需要的属性
    car不仅缺少实例变量:flySpeed 缺少方法:fly
3.如果父类继承下的方法不满足需求
    例如父类继承下来的init方法不能满足需求
    在子类中重写这个方法
特性:
    (1)无论是任何权限   当前类方法直接通过变量名访问;
    (2)公有的:外界可以直接方法  访问形式obj->_a=100;
             公有的继承到子类中还是公有的
    (3)私有的 外界不能直接访问,需要通过获取方法和设置方法去间接访问
              访问形式:[obj name];
    (4)受保护的 外界不能直接访问,需要通过获取方法和设置方法去间接访问
             访问形式:[obj name];
             父类中是受保护的,子类中也是受保护的
  父类中是私有的不能继承到子类中
   1:父类私有的,子类能不能直接访问??------>不能
   2:子类对象里有没有父类的私有实例变量------->内存中是有
   3:子类如何范围父类私有的实例变量
   第一步:添加实例变量@property
    第二步:子类中通过self.named 形式访问

@public
    int _a;
@private
    int _b;
@protected
    int _c;
    //默认情况下是受保护的
    double _speed;
    double _weight;
@property double speed;
@property double weight;
@property int b;
//定义了Property,么有定义对应的实例变量
//  默认生成实例变量权限是私有的
//      子类中需要用self.name的实现访问
@property (copy)NSString *name;
//方法
-(void)move;
-(void)load;
总结:  父类            子类
            公有            公有
            私有            无法继承(本质:没有访问权限,子类中有变量的空间)
            受保护        受保护

4.方法的重写
 1.重写:子类重新实现父类中的某个方法,覆盖父类以前的做法
 2.注意
 1> 父类必须声明在子类的前面
 2> 子类不能拥有和父类相同的成员变量
 3> 调用某个方法时,优先去当前类中找,如果找不到,去父类中找
 
 3.坏处:耦合性太强
#import <Foundation/Foundation.h>
// Person
@interface Person : NSObject
{
    int _age;
}

- (void)setAge:(int)age;
- (int)age;

- (void)run;

+ (void)test;

@end

@implementation Person

+ (void)test
{
    NSLog(@"Person+test");
}

- (void)run
{
    NSLog(@"person---跑");
}

- (void)setAge:(int)age
{
    _age = age;
}
- (int)age
{
    return _age;
}
@end

// 不允许子类和父类拥有相同名称的成员变量
// Student
@interface Student : Person
{
    int _no;
    // int _age;
}

+ (void)test2;

@end

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

+ (void)test2
{
    [self test];
}
@end


int main()
{
    [Student test2];
    
//    Student *s = [Student new];
//    
//    [s run];
    
    return 0;
}

  

    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值