黑马程序员——ios学习笔记 OC 封装&多态

本文主要探讨了iOS开发中Objective-C(OC)的两大核心概念——封装和多态。封装强调了类的内部保护,通过访问权限修饰符控制字段和方法的可见性。多态则描述了不同对象对同一方法的响应能力,基于动态绑定和方法重写。多态的优势在于简化编程接口、实现类和实例的接口隔离。在实践中要注意避免在get方法中使用self.age导致的死循环问题,可以利用@property特性来平衡setter与getter的重写。
摘要由CSDN通过智能技术生成

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

封装

这是面向对象的根本,即一个结构不仅可以有数据成员,也可以有函数成员,可以把一个结构需要的属性以及针对于属性提供的方法封装在一个结构中,这个结构就是类,封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能,OC中有四种访问权限修饰符:publicprotect,private,package,访问权限一次递减的,这样在定义类的时候,哪些字段和方法不想暴露出去,哪些字段和方法可以暴露,可以通过修饰符来完成,这就是封装。

#import <Foundation/Foundation.h>  
  
@interface Person : NSObject{  
    //点语法只能适用于set/get方法,如果没有对应的set/get方法的话,是不能使用.语法的  
    NSString *_name;  
    NSInteger _age;  
}  
  
- (void)setName:(NSString *)name;    //申明_name的setter方法
- (void)setAge:(int)age;  	 //申明_age的setter方法
  
- (NSString *)name;                  //申明_name的getter方法
- (int) age;  	  //申明_age的getter方法
    @end  
#import "Person.h"    
@implementation Person  
  
- (void)setName:(NSString *)name{    //实现_name的setter方法
_name = name;  
}  
- (void)setAge:(int)age{            //实现_age的setter方法
_age = age;  
}  
- (NSString *)name{                 //实现_name的getter方法
    return _name;  
}  
- (int) age{                         //实现_age的getter方法
    return _age;  
}    
@end  
 
#import <Foundation/Foundation.h>  
#import "Person.h"  
  
int main(int argc, const charchar * argv[]) {  
    @autoreleasepool {  
        Person *person = [[Person new];  
        Person.age = 18;       //采用点语法自动替换成[person setAge:18]
Person.name = @”小明”;  //采用点语法自动替换成[person setName:@”小明”]
        NSLog(@”age = %d,name = %@ ”,person.age,person.name);
                //此时点语法将自动替换成getter方法
    }  
    return 0;  
}  


多态

不同对象可以访问相同方法的能力或现象就叫做多态。

多态的原理:

动态绑定,动态类型能使程序在运行是才确定对象的所属类型。其程序上的体现就是通过父类指针指向不同的子类对象。

多态的条件:

有继承关系,有方法的重写;

父类申明的变量指向子类的对象。
多态的优势:

1、不同的类对象可以使用习惯的调用方式;

2、简化了编程接口;

3、实现类和实例的接口隔离。

 

//Game.h
#import <Foundation/Foundation.h>
 
@interface Game : NSObject
@property(nonatomic,assign)NSString* name;
-(void)run;
@end
 
//  Game.m
 
#import "Game.h"
 
@implementation Game
-(void)run{
    NSLog(@"游戏正在运行!");
}
@end
 
//  LOL.h
 
#import "Game.h"
 
@interface LOL : Game
-(void)run;
@end
 
//  LOL.m
 
#import "LOL.h"
 
@implementation LOL
-(void)run{
    NSLog(@"%@正在运行!",self.name);
}
@end
 
 
 
#import <Foundation/Foundation.h>
#import "LOL.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Game *l = [LOL new];  //定义一个指向LOL的Game对象l
        Game *g = [Game new]; //定义一个Game对象g
        l.name = @"LOL";        //使用了点语法赋值
        [g run];                //调用了Game的run方法
        [l run];                //调用了LOL重写的run方法
    }
    return 0;
}

总结:

在get方法中不能使用self.age = age,因为self.age等价于[self setAge:age],这样就会出现死循环了

可以使用@property自动生成实例变量与settergetter方法,这时settergetter方法可以重写,但不能同时重写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值