【OC语言】第三篇·类方法的使用、匿名类以及封装

来源:互联网 发布:恒生指数期货模拟软件 编辑:程序博客网 时间:2024/06/11 16:46
一、类方法
    1. 概述:
       1)实例方法就是一个方法,它在类的是实例范围内执行。即:在调用实例方法前,必须创建一个类的实例。
      2)类方法不需要创建实例。
      3)+表示类方法,就是类调用方法,不依赖任何对象的方法。-表示是实例方法。
    2. 类方法调用
        [类名称 类方法名称];
    3. 注意事项
      1)实例方法和类方法同名
      2)类方法可以从父方法继承而来,子类可以重写类方法。
      3)类方法和实例方法一样在interface里声明,在implementation 里实现
      4)类方法只能被向类方法发送消息才被执行,向实例对象发送类方法是不能被执行的
      5)在类方法是使用了self,这个self执行的类对象class object 而不是实例对象instance object
    4. 类方法的优点
                1)节省内存空间               2)提供效率             3)作为工具方法
    5. 类方法易犯错误:类方法中不能访问类的成员变量
    6. 类方法和对象方法比较:
      1)对象方法(实例方法):
                  以 - 号开头
                  可以使用成员变量
                  用对象调用对象方法(可以直接调用类方法)
                  对象方法可以调用当前对象或者其它对象的方法(是通过将对象作为参数传入方法)
           对象方法中可以调用其它对象方法:
            (1)当前对象方法中,可以创建对象(可以是当前类实例对象,也可以是其它类实例对象),使用新创建的对象调用对象方法。
            (2)可以使用self
            (3)对象作为方法参数传递过来,可以使用传递过来的对象调用方法
      2)类方法:
                  以+号开头
                   在类方法中可以调用对象方法(不能直接调用对象方法)
                     (1)对象作为方法参数传递过来
                     (2)可以创建一个对象
                  类方法可以调用其它类方法,但是类方法不能调用自身(调用自身会形成死循环)
      3)示例程序:简单计算器
类的声明

+(void)add:(int)num1 and:(int)num2; //两数相加+(void)sub:(int)num1 and:(int)num2; //两数相减+(void)mul:(int)num1 and:(int)num2; //两数相乘+(void)div:(int)num1 nad:(int)num2; //两数相除

类的实现

#import "Calculator.h"@implementation Calculator+(void)add:(int)num1 and:(int)num2 //两数相加{ NSLog(@"%d + %d = %d",num1,num2,num1+num2);}+(void)sub:(int)num1 and:(int)num2//两数相减{ NSLog(@"%d - %d = %d",num1,num2,num1-num2);}+(void)mul:(int)num1 and:(int)num2 //两数相乘{ NSLog(@"%d * %d = %d",num1,num2,num1*num2);}+(void)div:(int)num1 and:(int)num2//两数相除{ NSLog(@"%d / %d = %.2f",num1,num2,(float)num1/num2);}@end

主函数

#import <Foundation/Foundation.h>#import "Calculator.h"int main(int argc, const char * argv[]) { @autoreleasepool { [Calculator add:10 and:20]; [Calculator sub:10 and:2]; [Calculator mul:10 and:3]; [Calculator div:25 and:5]; } return 0;}

运行结果

 
二、匿名类
    1. 用[Car new]  ( [[ Car alloc ] init ] )分配给Car类一个实例空间
    2. 使用方法:
      1)使用匿名类访问实例变量,可以访问该匿名实例,但是只能访问一次。以后访问,会新建一个实例空间。
      2)使用匿名类可以调用方法。
    3. 匿名类的优缺点
        优点:可以简化代码,方便方法调用。
        缺点:匿名对象实例化以后,只能正确的使用成员变量一次。

三、封装
    1. 将数据隐藏起来,只能用此类的方法函数才可以访问或者设置数据,不可被外部任意修改,是面向对象设计的本质。降低了数据无用的可能性。
    2. 封装的步骤
      1)setter方法(设置器):在set方法的内部可以对一些不合理的数据过滤筛选。set方法作用:为提供一个设置成员变量值的方法。
            命名规范:
                (1)方法名必须以set开头
                (2)set后面跟上成员变量的名称,首字母大写
                (3)返回值一定是void
                (4)一定要接受一个参数,而且参数类型需要和成员变量的类型一致
                (5)形参名不能和变量名一样(成员变量名以_线开头)
           好处:
                (1)不让数据暴露在外,保证了数据的安全性
                (2)对设置的数据进行过滤
      2)getter方法(访问器)
            作用:为调用者返回对象内部的成员变量
            命名规范:
                (1)一定有返回值,返回值的类型和成员变量的类型一致
                (2)方法名和去掉下划线的成员变量名一样
                (3)不需要接收任何参数    
      3)示例程序
类声明

typedef enum{kSexFemale,kSexMale} Sex;@interface Person : NSObject{ NSString *_name; //姓名 Sex _sex; //性别 int _age; //年龄 float _height; //身高 }//设置成员变量的值-(void) setName:(NSString *)name;-(void) setSex:(Sex)sex;-(void) setAge:(int)age;-(void) setHeight:(float)height;//访问成员变量的值-(NSString *)name;-(Sex)sex;-(int)age;-(float)height;@end

set

-(void) setName:(NSString *)name{ _name = name;}-(void) setSex:(Sex)sex{ _sex = sex;}-(void) setAge:(int)age{ _age = age;}-(void) setHeight:(float)height{ _height = height;}

get

-(NSString *)name{ return _name;}-(Sex)sex{ return _sex;}-(int)age{ return _age;}-(float)height{ return _height;}@end


四、依赖关系
    1. 概念:A对象作为B对象的局部变量或是方法形参的,B依赖与A,这时候我们称A与B存在一种依赖关系。
    2. 耦合度:当修改一个对象的时候,对另外一个对象的影响程度。
    3. 低耦合:当修改一个对象,对其它对象影响比较小。
    4. 高内聚:一个对象仅仅做自己相关的事情。
    5. 面向对象设计原则:单一职责原则。

五、关联关系
    1. HasA关系:当一个对象拥有另外一个对象的时候,当B对象为A对象成员变量的时候,B对象与A对象之间存在一种关联关系。
    2. 关联关系的耦合度高于依赖关系。
    3. 关联关系是面向对象中最常用的一种关系。 

六、static关键字
    1. 在变量声明前加上关键字static,可以使局部变量保留多次调用一个方法所得的值。
    2. 变量为静态变量,位于程序的全局数据区。
    3. 变量为全局变量,可将声明放在实现文件(.m)的开始部分。
    4. 使用static修饰实例变量是不被允许的。
0 0