• OC语言-03-OC语言-三大特性


    一、封装

    1> 封装的定义

    • 隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别

    2> 封装的好处

    • 可以通过set方法防止为成员变量设置不合理的值
    • 仅向外部提供公开的接口,屏蔽成员变量的操作过程
    • 外界可以通过接口间接的操作成员变量,而不必关注内部细节

    3> set方法和get方法

    1. set方法

      ① 作用:为成员变量赋值
      ② 命名规范
      	1)名字必须以set开头
      	2)set后紧跟成员变量名,且首字母要大写
      	3)返回值一定是void类型
      	4)一定接收一个类型与要赋值的成员变量一致的参数
      ③ 若成员变量为只读类型,通常不需要set方法
      ④ set方法可以用于监听成员变量的改变,而触发相应的操作
      
    2. get方法

      ① 作用:返回成员变量的值
      ② 命名规范
      	1)方法名与成员变量名一致
      	2)返回值类型与要返回的成员变量一致
      	3)不需要接收任何参数
      

    二、继承

    1> 继承的定义

    • 一个对象直接使用另一个对象的属性和方法,并扩展自己特有的属性和方法

    2> 优缺点

    1. 优点

      ① 基于原有的模型,扩充特有的方法
      ② 抽取重复代码,降低代码冗余
      ③ 建立类与类之间的联系
      
    2. 缺点

      ① 耦合性太强
      

    3> 基本使用

    • 可以使用继承自父类的成员变量和方法
    • 可以根据需求扩充自己特有的方法
    • 可以在子类中用同名方法来重写父类的方法
    • 调用一个方法时,先在当前类中找该方法,若找不到,再在父类中找

    4> 使用注意

    • 用户自定义的类通常继承自系统中的根类,如:NSObject
    • OC语言的继承是单继承
    • 只能继承父类的非私有成员变量和方法
    • 继承不能减少父类中的成员变量和方法
    • 子类中不允许出现与父类中同名的成员变量
    • 父类必须声明在子类的前面

    5> 继承与组合

    1. 继承

      ① 当两个类用有相同的属性和方法时,通常将相同的属性和方法抽取到
        一个父类,使用继承关系
      ② 若A类用有B类的部分属性和方法,通常让B类继承自A类
      
    2. 组合

      ① 当一个类包含另一个类的全部属性和方法,通常让这个类作为另一个
        类的属性,使用组合关系
      ② 若A类用有B类的全部属性和方法,通常让B类作为A类的属性
      

    6> self与super

    1. self

      ① 基本使用
      	1)self是一个指针,指向调用当前方法的对象/类
      	2)可以调用成员变量和方法
      	3)使用self来调用成员变量,可以区分同名的局部变量
      ② 使用注意
      	1)用self调用当前方法会引发死循环
      	2)不能使用self在类方法中调用对象方法,反之亦然
      	3)不能使用self调用函数
      
    2. super

      ① 基本使用
      	1)每个类都会有一个super指针指向其父类
      	2)子类重写父类的方法时,若想保留父类的一些行为,通常用super
      	  调用父类中被重写的方法
      ② 使用注意
      	1)通过super可以直接调用父类中的类方法/对象方法
      	2)所调用方法的类型与当前方法的类型一致,如:若当前方法为类
      	  方法,则调用父类中的类方法,反之亦然
      

    三、多态

    1> 动态绑定的概念

    • 在程序的执行期间判断所引用对象的实际类型,根据实际的类型调用其相应的方法

    2> 基本使用

    • 多态通常指多种形态
    • 体现为父类指针指向子类对象
    • 使用类动态绑定的概念

    3> 优缺点

    1. 优点

      ① 当一个函数/方法用父类类型作为参数,可以接收父类、子类对象
      ② 降低了代码的冗余
      
    2. 缺点

      ① 不能使用父类指针调用子类的方法
      ② 编译器只会检测语法是否有误,只有在运行时才会根据动态绑定结果
        调用相应的方法
      

    4> 使用注意

    • 多态必须以继承为基础,没有继承就没有多态
    • 在运行时会动态检测指针指向的真正对象
    • OC语言是弱语法,可以用用任何类型的指针指向一个已知的对象,只会发出警告

    四、示例

    /*
     1.定义一个Animal类,方法:eat
     2.定义一个Dog类和Cat类继承自Animal类
     3.定义一个Person类,属性:animal(Dog或Cat);方法:feed(喂动物)
    */
    #import <Foundation/Foundation.h>
    
    
    /********Animal类*********/
    @interface Animal : NSObject
    
    //声明Animal的eat方法
    - (void)eat;
    
    @end
    
    /*Animal类的实现*/
    @implementation Animal
    //此处可以不实现,只在子类中实现,但是编译器会警告
    - (void)eat
    {
        NSLog(@"Animal在吃")
    	}
    	ed	
    	
    	/*****Dog类继承自Animal****/
    	@interface Dog : Anmal
    	ed
    	
    	/*Dog类的现*/
    	@implementationDog
    	//重写eat方法,使其符合Dg对象
    	- (voidea
    	{
    	    NSLog(@"Dog在吃")
    	}
    	ed	
    	
    	/*****Cat类继承自Animal****/
    	@interface Cat : Anmal
    	ed
    	
    	/*Cat类的现*/
    	@implementationCat
    	//重写eat方法,使其符合Ct对象
    	- (voidea
    	{
    	    NSLog(@"Cat在吃")
    	}
    	ed	
    	
    	/****Person类用有Animal***/
    	@interface Person : NSObec
    	{
    	    //使每个人拥有一个动物,用组合
    	    Animal *_anial
    	}
    	//为_animal属性设置set和gt方法
    	- (void)setAnimal:(Animal *)anial;
    	- (Animal *)anial;
    	//声明一个方法,使人能给自己用有的相应物喂食
    	- (void)fed;
    	ed
    	
    	/*Person类的现*/
    	@implementation Peson
    	- (void)setAnimal:(Animal *)anma
    	{
    	    _animal = anial
    	}
    	- (Animal *)anma
    	{
    	    return _anial
    	}
    	- (void)ee
    	{
    	    [_animal et]
    	}
    	ed	
    	
    	/******测试函数main******/
    	int man(
    	{
    	    //创建两个Persn对象
    	    Person *p = [Person nw];
    	    Person *p2 = [Person nw];
    	    //创建一个Dg对象
    	    Dog *d = [Dog nw];
    	    //创建一个Ct对象
    	    Cat *c = [Cat nw];
    	   
    	    //给对象p的Animal属性赋值为Dg对象
    	    [p setAnimald];
    	    //给对象p的Animal属性赋值为Ct对象
    	    [p2 setAnimalc];
    	   
    	    //调用p、p2的feed方法,检测态效果
    	    [p fed];
    	    [p2 fed];
    	   
    	    retur 0;
    	}
    
  • 相关阅读:
    Flask把变量注册到模板中
    $.each与$(data).each区别
    【Python备忘】python判断文件和文件夹是否存在
    ISP图像质量自动化测试方法
    使用微软的(how-old.net)构建智能门店管理系统
    在virtualenv中安装libxml2和libxslt
    Python 装饰器学习以及实际使用场景实践
    tensorflow零起点快速入门(4) --入门常用API
    tensorflow零起点快速入门(3)
    树莓派和STM32通过USB和串口通信记录
  • 原文地址:https://www.cnblogs.com/theDesertIslandOutOfTheWorld/p/4724041.html
Copyright © 2020-2023  润新知