关闭

构造方法、类方法、类的复合

标签: 面向对象
262人阅读 评论(0) 收藏 举报
分类:

今天是学习OC语言的第二天,感觉难度有明显的增大。尤其是课后留的一道“小明型”的题更是让我信心大跌。不管难度如何,学的好坏,一天结束了也得总结一下,不然这一天对于我算是白过了。

今天主要讲了三个知识点:1.构造方法 2.类方法 3.类的复合。三个知识点,属类的方法比较简单,构造方法是为类的复合打的一个机车,类的复合理解理解起来虽不是很难,但出的题确实让人头大到爆。下面就由浅到深,由简单到难总结一下今天学过的知识。

1.类的方法:

之前学过的一些set方法和get方法都是对象方法,在方法的最前面有减号(“-”)。如:-(void) setName{_name = name;}。至于类方法也称加号方法,因为在类方法的最前面有一个加号(“+”)。如:+(void) printSomething{NSLog(@"you are not the worst!");}。类方法与对象方法的主要区别就是类方法可以直接调用而不需要创建,显得比对象方法要简单,可我这两天用到的方法中却是对象方法居多。

类方法的直接调用举例:

如上面提到的printSomething方法,如果这是一个对象方法,在主函数中要调用此方法,首先需要创建一个对象,如:Person * xiaoming = [Person alloc];  xiaoming这个对象被创建后,然后用这个对象调用此方法:[xiaoming printSomething]; 而如果这是一个类方法,在主函数中则可以直接调用,如[Math printfSomething];

2.构造方法

类方法之后就是构造方法,构造方法也称为初始化方法,顾名思义,就是要对一些东西进行初始化,实际就是对成员变量进行初始化。用了构造方法之后主函数中的代码就更加地精简了。

构造方法的返回值类型是一个指针类型。如要写一个Person类的构造函数:

-(Person *) initWithName:(NSString *) name setAge:(int) age  setWeight:(float) weight{

    if (self = [super init]) {

        _name = name;   //成员变量赋值发生改变 

        _age = age;

        _weight = weight;

    }

    return self;

}

然后在主函数中调用此方法。

Person * xiaogang = [[Person alloc] initWithName:@"刚刚" setAge:11 setWeight:22.2]

这里出现了self和super,暂且不必深究,只需要知道self表示本类,super表示父类机壳,注意:构造方法的最后要返回self。

本人在学习的时候感觉构造函数和set函数挺像的,都是设置成员变量的值。可set方法可以用来修改初始化之后的值。

如:

set方法的实现:

-(void) setName:(NSString *)name  setAge:(int) age  setWeight:(float) weight {

    _name = name;

    _age= age;

    _weight = weight;

    

}

set方法的调用:

[xiaoming setName:@"刘德华" setAge:11 setWeight:122.22];

这样输出的姓名、年龄、体重都发生了的改变。

3.类的复合

类的复合就是一个类是由其他几个类组合的。如一辆汽车这个类是由轮胎、发动机、车壳等几个类组成的。再如人这个类是由头、胳膊、腿等几个类组成的,头、胳膊这几个类都是人这个类的成员变量。这类题都是比较难的,对于我来说,所以下面举一个题以便解释得能更清晰一些。

电脑得组装:

假设电脑是由显卡、硬盘、内存这几个类组成的,最后要显示一台电脑的组成。

首先分析类,一共要建立四个类即Computer、Disk、VideoCard、Memory。

Memory:

#import <Foundation/Foundation.h>


@interface Memory : NSObject

{

    NSString * _type;//型号

    

}


-(Memory *) initWithType:(NSString *) type;


-(NSString *) type;


@end


#import "Memory.h"


@implementation Memory

-(Memory *) initWithType:(NSString *) type {

    self = [super init];

    if(self) {

        _type = type;

    }

    return  self;

}


-(NSString *) type{

    return _type;

}



@end

Disk:

#import <Foundation/Foundation.h>


@interface Disk : NSObject

{

    NSString * _capacity;//容量

}


-(Disk *) initWithDisk:(NSString *) capacity;


-(NSString *) capacity;

@end

VideoCard:

#import <Foundation/Foundation.h>


@interface VideoCard : NSObject

{

    NSString * _type;//型号

}

//构造方法

-(VideoCard *) initWithType: (NSString *) type;

//get方法

-(NSString *) type;

@end

#import "VideoCard.h"


@implementation VideoCard

-(VideoCard *) initWithType: (NSString *) type{

    if(self = [super init]) {

        _type = type;

    }

    

    return self;

}


-(NSString *) type{

    return _type;

}

@end

上面这三个类的建立都是相似的,一个构造方法,一个get方法。

Computer:


#import <Foundation/Foundation.h>

#import "Memory.h"

#import "Disk.h"

#import "VideoCard.h"

@interface Computer : NSObject

{

    //用自定义的类声明一个变量

    Memory * _memory;

    Disk * _disk;

    VideoCard * _videoCard;

}


//初始化(构造方法)

-(Computer *) initWithMemory:( Memory  *)memory  withDisk:(Disk *) disk  withVideoCard:(VideoCard *) videoCard;


-(void) showInfors;

@end

#import "Computer.h"


@implementation Computer


//构造方法的实现

-(Computer *) initWithMemory:( Memory  *)memory  withDisk:(Disk *) disk  withVideoCard:(VideoCard *) videoCard {

    if (self = [super init]) {

        //通过传参将对象memory传给_memory

        _memory = memory;

        _disk = disk;

        _videoCard = videoCard;

    }

    

    return self;

}


-(void) showInfors{

    //先创建内存条memory  再用其组装电脑, 将memory赋值给_memory,_memory就成了对象,现在利用_memory 对象调用type方法

    NSString * memoryType = [_memory type];

    NSString * diskCapacity = [_disk capacity];

    NSString * cardType = [_videoCard type];

    

    NSLog(@"内存型号:%@硬盘容量:%@显卡型号:%@", memoryType, diskCapacity, cardType);

}

@end

Computer这个类的声明比较特殊,首先是它的成员变量。成员变量有三个,就是Memory、Disk、VideoCard,声明时要用自定义的这三个类进行声明,将这三自定义的类看成一中类型就像NSString一样。其次是构造方法的实现,将参数传给定义的变量中,(和其他简单的构造方法一样)。

主函数:

#import <Foundation/Foundation.h>

#import "Memory.h"

#import "Disk.h"

#import "VideoCard.h"

#import "Computer.h"

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

{


    @autoreleasepool {

        //利用构造方法

        //创建内存条

        Memory * memory = [[Memory alloc] initWithType:@"4G"];

        NSLog(@"%@", memory);   //此时打印的是一个地址。

        //创建硬盘

        Disk * disk = [[Disk alloc] initWithDisk:@"500G"];

        //创建显卡

        VideoCard * videoCar = [[VideoCard alloc] initWithType:@"集成显卡"];

        //创建一个电脑

        Computer * computer = [[Computer alloc] initWithMemory:memory withDisk:disk withVideoCard:videoCar];

        

        

        [computer showInfors];

        

    }

    return 0;

}

主函数中有一个showInfos方法用来输出电脑的信息,这里要用到三个变量的get方法来得到传入的参数。

虽然今天做了总结,今天的作业还是没有完全完成,说了半天又是不知所云,继续努力吧!

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:105677次
    • 积分:3118
    • 等级:
    • 排名:第11533名
    • 原创:197篇
    • 转载:21篇
    • 译文:1篇
    • 评论:16条
    最新评论