OC面向对象-多态

OC面向对象-多态

一、基本概念

  

  1>多态在代码中的体现,即为多种形态,没有继承就没有多态

  2>在使用多态时,会进行动态检测,以调用真实的对象方法

  3>多态在代码中的体现即父类指针指向子类对象

  Animal类的声明

#import <Foundation/Foundation>
//声明一个Animal类,该类继承自NSObject
@interface Animal : NSObject
//在Animal类中声明一个eat的对象方法
-(void) eat;
@end

  Animal类的实现

#import "Animal.h"
/**eat方法的实现*/
@implementation Animal-(void) eat{
    NSLog(@"动物吃东西");
}
@end

  Dog继承自Animal类

#import "Animal.h"
/**Dog类继承自Animal类,拥有了Animal类的所有属性跟方法*/
@interface Dog : Animal
//在子类中声明了父类中已经有的eat方法,这称之为方法的重写
-(void) eat;
@end

  Dog类的实现

#import "Dog.h"
@implementation Dog
/** 重写eat*/
-(void) eat{
    NSLog(@"狗吃东西");
}
@end

  测试程序

#import <Foundation/Foundation>
#import "Animal.h"
#import "Dog.h"

int main(){

    //Dog类型的指针指向Dog类型的对象
    Dog * dog=[[Dog alloc] init];

    .//Dog类对象调用对象方法
    [dog eat];

    //多态
    //父类指针指向子类对象
    Animal * a=[[Dog alloc] init];
    //这里调用的是Dog类中的eat方法
    [a eat];

    //Animal类型的指针指向Animal类型的对象
    Animal * a1=[[Animal alloc] init];
    [a1 eat];

    //下面都是多态的体现
    NSObject *n=[[Dog alloc] init];
    //[n eat] //不能这样调用
    NSObject * n1=[[Animal alloc] init];

return 0;
}

二、使用注意

  代码分析

    Dog *dog=[[Animal alloc] init];  动物是一条狗?语义正确吗?

    NSString *str=[Dog new];   狗是一个字符串?正确吗?

  OC语言是一门弱语言,编译的时候并不会报错,所以这就要求我们在实际的开发过程中一定要按照既定的规范来写代码,不要出现狗是一个字符串的问题.

  多提的好处:

    需要一个新的函数专门用来喂狗

    void feed(Dog *d){

      [d eat];

} 

    如果这个时候也需要喂猫,那就应该重写一个新的函数

    void feed(Cat *c){

      [c eat];

} 

    而狗和猫实际上都继承自动物这个类,在这里就可以使用多态来简化代码了,这里只需要把函数的参数写成是Animal *类型的,那么Dog和Cat类型的对象就都可以传入进来,调用的时候直接改变参数就可以了.

  多态的局限性:

    父类类型的指针变量不能直接调用子类特有的方法.

    不建议的做法:

    Animal *a=[[Dog alloc] init];

    [a run];//在Animal类中没有run方法,这里调用了狗对象的方法。

    解决方法:可以将a强制转换为Dog*类型的变量,如下:

    Dog *d=(Dog *)a;//使用强制转换,这里a和d指向的是同一个狗对象

三、多态使用总结

  1>没有继承就么有多态

  2>代码的体现:父类类型的指针指向子类对象

  3>好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了

  4>局限性:父类类型的变量不恩给你直接调用子类特有的方法,如果必须要调用,则必须强制转换为子类特有的方法

四、字符串补充内容

  @"123‘字符串也是一个对象,属于NSString这个类,下面对字符串对象的一些代码说明:

#import <Foundation/Foundation>
int main(){

    //最简单的创建字符串的方式
    NSString *str=@"张三";
    char *name="张三";

    //打印字符串
    NSLog(@"%s",name);
    NSLog(@"%@在看书",str);

    int a=5;
    int b=10;
    //创建字符串的另一种方法
    NSString *str=[NSString stringWithFormat:@"我已经敲了%d个小时,准备学够%d个小时",a,b];
    NSLog(@"%@",str);
    return 0;
}

  字符串对象的length方法:计算的是字符串的字数,而不是像strlen函数那样,计算的是字符数.如:"哈ha123"length得出的结果是6,返回unsigned long类型,而strlen函数得出的结果是8,因为一个汉字占3个字节.

  提示:字数也包括空格

    用途:给符号名称指定程序常量,放在程序的开始,但是要在#import的后面

  注意:定义的常量最好都要大写

时间: 2024-12-28 17:02:52

OC面向对象-多态的相关文章

转:OC面向对象—多态

OC面向对象—多态 一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. Animal类的声明 Animal类的实现 Dog类继承自Animal类 Dog类的实现 测试程序: 二.使用注意 代码分析: Dog *d=[[Animal  alloc] init];   动物是一条狗?语义正确吗? NSString *str=[Dog  new];     狗是一个字符串?

黑马程序员-OC面向对象多态笔记

面向对象的多态是建立在继承上,可以说没有继承就没有多态: 多态:父类指针指向了子类的对象: 1 int main() 2 { 3 //假设已定义了Animal类和它的子类Dog,那么多态的代码体现就是 4 Animal *a = [Dog d];//父类指针指向了子类对象 5 6 } 多态的定义是比较简单的,也好理解,关键在于它的指针动态绑定,究竟调用哪个方法: 1 #import <Foundation/Foundation.h> 2 3 //Animal类的声明 4 @interface

OC面向对象—多态

一.基本概念 多态在代码中的体现,即为多种形态,必须要有继承,没有继承就没有多态. 在使用多态是,会进行动态检测,以调用真实的对象方法. 多态在代码中的体现即父类指针指向子类对象. Animal类的声明 Animal类的实现 Dog类继承自Animal类 Dog类的实现 测试程序: 二.使用注意 代码分析: Dog *d=[[Animal  alloc] init];   动物是一条狗?语义正确吗? NSString *str=[Dog  new];     狗是一个字符串?正确吗? Oc语言是

OC面向对象封装

OC面向对象封装 一.面向对象和封装 面向对象的三大特性:封装(成员变量),继承,多态 在OC语言中,使用@interface和@implementation来处理类. @interface就好像暴露在外面的时钟表面,像外界提供展示以及接口,@implementation就好像隐藏在时钟内部的构造实现,把具体的实现封装了起来. 二.Set方法 在研发过程中,考虑到安全性要求,我们一般不在成员变量名前面使用@public,@protected等关键字修饰,而是使用Set方法来为对象提供成员变量值,

iOS开发OC基础:OC基础概念总结,OC面向对象的思想

一.什么是OOP: OOP(Object Oriented Programming):面向对象编程 二.面向对象和面向过程的区别: 面向过程编程:分析解决问题的步骤,实现函数,依次使用面向对象编程:分解问题组成的对象,协调对象间的联系和通信,解决问题. 面向过程是以事件为中心,关心的是完成这个事件的详细步骤:面向对象是以事物为中心,关心的是事物应该具备的功能,而完成一个事件只是事物所有功能里面的一个小功能(以过程为中心,以对象为中心) 三.类和对象 对象定义了解决问题的步骤中的行为,不刻意完成一

黑马程序员--Objective-C之--OC面向对象的三大特征

OC面向对象的三大特征是封装.继承和多态. OC语言也支持面向对象的三大特征,OC提供了@private.@package.@protected.@public等访问控制符来实现封装 OC也允许子类来继承父类,并且支持多态. 一.封装 封装指的是將对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法对内部信息的操作和访问. OC的封装特性需要通过使用访问控制符来实现. (一).访问控制符 1.@private:当前类访问权限.如果类的成员变量使用@priva

OC面向对象的三大特征

OC面向对象的三大特征 1.OC面向对象的三大特封装 1)封装:完整的说是成员变量的封装. 2)在成语方法里面的成员变量最好不要使用@public这样会直接暴露在外面被别人随随便便修改,封装的方法还可以达到过滤无效数据的作用. 3)对成员变量只读(readonly):只允许外界访问我的no,不允许外界修改我,只需要提供get方法. 4)对成员变量只写:不允许外界访问我的no,只允许外界修改我,只需要提供set方法. set 方法的注意点: 作用: 提供一个方法给外界设置成员变量值,可以在方法里面

09.面向对象多态的概述及其代码体现

09.01_面向对象(多态的概述及其代码体现) A:多态(polymorphic [,p?l?'m??f?k])概述 事物存在的多种形态 B:多态前提 a:要有继承关系. b:要有方法重写. c:要有父类引用指向子类对象. C:案例演示 代码体现多态 案例: class Demo1_Polymorphic { public static void main(String[] args) { Cat c = new Cat();//猫是一只猫 c.eat(); Animal a = new Cat

面向对象多态之接口

申明下:我也是新手,以下如有不对或不合适的地方望指出,一起交流O(∩_∩)O哈! 好了,转入正题 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Interface 7 { 8 class InterfaceTest 9 { 10 static void Main(string[] args) 11 { 12 #region 测试