面向对象OC之封装浅谈

一、面向对象和封装

面向对象的三大特性:封装、继承和多态

OC语言中,使用@interface@implementation来处理类。

 

@interface就好像暴露在外面的时钟表面,像外界提供展示以及接口。@implementation就好像隐藏在时钟内部的构造实现,把具体的实现封装了起来。

二、Set方法

在开发的过程中,考虑到安全行的要求,我们一般不再成员变量前面使用@public、@protected等关键字修饰,而是使用Set方法来为对象提供成员变量的值。在Set方法中也可以对一些不合理的值进行一些筛选。

Set 方法的作用:为外界提供一个设置成员变量值的方法

命名规范:

1、方法名必须以set开头

2、set方法后面跟上成员变量的名称,首字母大写

3、返回值一定是void

4、一定要接受一个参数,而且参数类型需要和成员变量的类型一致

5、形参名不能和成员变量名一样

Set的方法好处

1、不让数据暴露在外,保证了数据的安全性

2、对数据进行筛选

Set方法使用实例:

Set方法声明:

#import <Foundation/Foundation.h>
@interface Person:NSObject
{
    //这里不再使用@public关键字
    int _age;
    
}
//set方法的声明,接受一个参数
-(void)setAge:(int)age;
- (void)print;
@end
Set方法实现

#import"Person.h"
@implementation Person
//set 方法的实现
-(void)setAge:(int)age
{
    _age=age;
}
-(void)print
{
    NSLog(@"age=%d",_age);
}
@end

主程序实现

#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p=[[Person alloc]init];
        //使用set方法设置person类对象age的值
        [p setAge:10];
        [p print];
    }
    return 0;
}
结果:

2015-03-12 22:50:39.233类练习[492:17060] age=10

三、Get方法

Get方法的作用:为调用者返回对象内部的成员变量

命名规范:

1、一定要有返回值,返回值的类型和成员变量类型一致

2、方法名和成员变量名一样

3、不需要接受任何参数

Get方法使用实例:

Get方法的声明

#import <Foundation/Foundation.h>
@interface Person:NSObject
{
    NSString *_name;
    
}
//set方法
-(void)setName:(NSString *)name;
//get方法
-(NSString *)name;

@end

Get方法的实现

#import"Person.h"
@implementation Person
//set 方法的实现
-(void)setName:(NSString *)name
{
    _name=name;
}
-(NSString *)name
{
    return _name;
}
@end

主程序

#import <Foundation/Foundation.h>

#import "Person.h"

int main(int argc,constchar * argv[]) {

    @autoreleasepool {

       Person *p=[[Personalloc]init];

        //使用set方法设置person类对象age的值

        [psetName:@"ChengLei"];

        //使用get方法获取成员变量的值

       NSLog(@"%@",[pname]);

    }

   return0;

}


注意:

在实际开发中不一定set和get方法都会提供,如果内部的成员变量比如学生的学号这样的数据只允许外界读取不允许修改的情况,通常只提供get方法不提供set方法。

成员变量命名以下划线_开头,get方法名不需要带下划线,使用下划线有两个好处:1、与get方法的方法名区分开来2、可以和其他一些局部变量区分开来,下划线开头的变量通常都是泪的成员变量。


四、Self关键字

Self是一个指针,谁调用了当前方法,self就指向了谁【出现在对象方法中,就代表了当前对象,出现在类方法中,就代表了当前类】

self 的用途:

1、可以利用self->成员变量名 访问当前对象内部的成员变量(仅在对象方法中使用)

2、[self 方法名]. 可以调用其他的对象方法或者类方法

五、练习

成绩类声明

/*
 设计一个成绩类,这个成绩类有以下四个属性
 OC成绩可读可写
 C成绩可读可写
 总分可读
 平均分可读
 */
@interface Score:NSObject
{
    int _OCScore;
    int _CScore;
    int _Sum;
    double _average;
    
}
//set方法
-(void)setOCScore:(int)ocscore;
//get方法
-(int)ocscore;
-(void)setCScore:(int)cscore;
//get方法
-(int)cscore;

-(int)sum;
-(double)average;

@end

成绩类实现


#import"Score.h"

@implementation Score

//set 方法的实现

-(void)setOCScore:(int)ocscore

{

   _OCScore=ocscore;

}

-(int)ocscore

{

    return_OCScore;

}

-(void)setCScore:(int)cscore

{

   _CScore=cscore;

    _Sum=_OCScore+_CScore;

    _average=_Sum/2;

}

-(int)cscore

{

    return_CScore;

}

-(int)sum

{

   return_Sum;

}

-(double)average

{

    return_average;

}

@end


主程序

#import <Foundation/Foundation.h>

#import "Score.h"


int main(int argc,constchar * argv[]) {

    @autoreleasepool {

       Score *S=[[Scorealloc]init];

        [SsetOCScore:80];

        [SsetCScore:90];

       NSLog(@"sum=%d",[Ssum]);

       NSLog(@"average=%.2f",[Saverage]);

        

        [SsetCScore:100];

       NSLog(@"sum=%d",[Ssum]);

       NSLog(@"average=%.2f",[Saverage]);

    }

   return0;

}

测试结果

2015-03-12 23:21:38.883类练习[577:25962] sum=170

2015-03-12 23:21:38.884类练习[577:25962] average=85.00

2015-03-12 23:21:38.885类练习[577:25962] sum=180

2015-03-12 23:21:38.885类练习[577:25962] average=90.00




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Objective-C 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是用于复制对象的两种不同方式。 浅拷贝是指创建一个新的对象,该对象与原始对象共享数据的内存地址。换句话说,新对象只是原始对象的一个引用,对新对象的修改也会影响原始对象。在 Objective-C 中,可以使用 `copy` 方法来执行浅拷贝。 深拷贝是指创建一个新的对象,并且复制原始对象的所有数据。这意味着新对象有自己的内存地址,对新对象的修改不会影响原始对象。在 Objective-C 中,可以使用 `mutableCopy` 方法来执行深拷贝。 需要注意的是,深拷贝只会复制对象本身,而不会递归地复制对象所包含的其他对象。如果需要对对象的所有数据进行递归复制,可以通过实现 NSCopying 协议来自定义深拷贝操作。 下面是一个示例代码,演示了如何执行浅拷贝和深拷贝: ```objective-c #import <Foundation/Foundation.h> @interface Person : NSObject <NSCopying> @property (nonatomic, copy) NSString *name; @end @implementation Person - (instancetype)copyWithZone:(NSZone *)zone { Person *copy = [[Person allocWithZone:zone] init]; copy.name = self.name; return copy; } @end int main(int argc, const char * argv[]) { @autoreleasepool { Person *person1 = [[Person alloc] init]; person1.name = @"John"; // 浅拷贝 Person *person2 = [person1 copy]; NSLog(@"person1: %@, person2: %@", person1.name, person2.name); // 输出:person1: John, person2: John // 深拷贝 Person *person3 = [person1 mutableCopy]; person3.name = @"Emily"; NSLog(@"person1: %@, person3: %@", person1.name, person3.name); // 输出:person1: John, person3: Emily } return 0; } ``` 在上面的示例中,使用 `copy` 方法执行了浅拷贝操作,`mutableCopy` 方法执行了深拷贝操作。注意,为了实现深拷贝,我们在 `Person` 类中遵循了 NSCopying 协议,并重写了 `copyWithZone:` 方法来自定义深拷贝操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值