OC语言——继承

继承    

        XXX是XXX

一,概念:

     1,应该分析下两个类里面如果有相同的成员变量或方法,就可以抽取它们的共同点作为一个父类。如:狗和锚

     2,当A类完全拥有B类的部分属性,可以用B类继承A类。

二,注意:有些情况下是不行的

      在什么情况下不能使用?

      如:Score父类,Student子类,下的C成绩和OC成绩。这设计不合逻辑。所以这里可以用组合。

三,组合   

      XXX拥有XXX 

四,super关健字

     它也是用在父类和子类里面,和self一样好用,同时类方法这些都一样。

     作用:可以调用父类的某些方法,在哪个方法中就调用哪个方法,类/对象。

重写的概念:拷贝父类的行为到子类,再扩充成为自己。

使用场合: 重写父类想保留的一些行为

下面利用代码来说明概念:

#import <Foundation/Foundation.h>

//提前了解下内存管理:对象不用后就要手动移除,在以前的开发中通过代码来移除。
//以前ios开发中50%是和内存相关的。有了ARC自动管理,所以现在代码清简了很多。
//相同的方法和成员变量,所以用一个相同的类装起来。

@interface Animal : NSObject
{
    int _age;
    double _weight;
}
- (void)setAge:(int)age;
- (int)age;

- (void)setWeight:(double)weight;
- (double)weight;
@end

@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里面所有的变量和方法
// Dog是子类
// Animal是父类
@interface Dog : Animal
@end

@implementation Dog
@end

@interface Cat : Animal
@end

@implementation Cat
@end

int main()
{
    Dog *d = [Dog new];
    
    [d setAge:10];
    
    NSLog(@"age = %d",[d age]);
    
    return 0;
}


五,好处:

  1,抽取重复的代码,如:成员变量,方法。

  2,建立了类之间的关系。子类可以拥有父类所有的属性和方法。重要的是父类也继承了根类NSObject,OC中所              有基本的类都是继承它(包括new方法,所以才有创建对象能力)。NSProxy除外。

下面是self使用,代码表示;

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    int _age;
}
- (void)setAge:(int)age;
- (int)age;

- (void)run;
+ (void)test1;
@end

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

- (void)run
{
    NSLog(@"student----run");
}
+ (void)test1
{
    NSLog(@"this is test1");
}
@end

//这里的子类不能放在父类前,必须放在后面。
@interface Student : Person
{
 //int _age;
 //会报错,OC里不能扩充一个和父类同名的成员变量.但方法要可以同名。但这样的话,父类声明方法,在子类实现也可以。
 //重写。子类重写父类。
 //每个类都会加到内存中
 //坏处:偶合性太强,就是这个类不见,另外一个类也用不了。
}
+ (void)test;
@end

@implementation Student
+ (void)test
{
    [self test1];//这里可以指向父类,调用父类的方法为自己所用。
}
@end
//--------------------
int main()
{
    Student *s = [Student new];
    
    [s run];
    //它优先到Student里找run方法,再去父类找,再往上找。
    
    return 0;
}


六,关于组合

     

#import <Foundation/Foundation.h>
// XXX拥有XXX
@interface Score : NSObject
{
    int _cScore;
    int _ocScore;
}
@end

@implementation Score
@end
//-------------
@interface Student : NSObject //组合的写法
{
    Score *_score; //Score *_XXX 组合的写法

    //int _cScore;
    //int _ocScore;
    
    int _age;
}
@end

@implementation Student
@end

int mian()
{

    return 0;
}


七,super关健字

#import <Foundation/Foundation.h>

@interface Zoombie : NSObject
- (void)walk;
+ (void)test;
- (void)test;
@end

@implementation Zoombie
- (void)walk
{
    NSLog(@"zoom走两步!!!!!!");
}
+ (void)test
{
    NSLog(@"这个是test one");
}
- (void)test
{
    NSLog(@"这个是test two");
}
@end
//-----------
@interface JumpZoonbie : Zoombie
+ (void)haha;
- (void)haha2;
@end

@implementation JumpZoonbie
+ (void)haha
{
    [super test]; //子类是+号,所以调用父类的+号,调用了类方法test.
}
- (void)walk
{
    NSLog(@"zoom再走两步--");
    //这里有个父类的方法[self walk];会死循环。[super walk]可以调用父类方法。
    //NSLog(@"zoom走两步!!!!!!");
    [super walk]; //super的使用
}
- (void)haha2
{
    [super test]; //super的使用
}
@end

int main()
{
    //JumpZoonbie *jz = [JumpZoonbie new];
    //[jz walk];
    
    //[JumpZoonbie haha];
    
    JumpZoonbie *jz = [JumpZoonbie new];
    [jz haha2];
    
    return 0;
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值