• 05-OC多态


    目录:

    一、继承的缺陷

    二、为什么使用继承

    三、组合和聚合

    四、多态

    回到顶部

    一、继承的缺陷

    1 提高了程序的复杂度,维护性和扩展性低

    2 破坏了类的封装性

    回到顶部

    二、为什么使用继承

    1 代码复用、制定规则、为了多态

    回到顶部

    三、组合和聚合

    1 复用代码更好的方式是组合和聚合,而不是继承。

    2 组合和聚合也是类与类之间"has a"的关系

    组合好比一体机,聚合好比台式机兼容好

    3 继承是继承一个类,而组合和聚合类之间是相互独立的,都继承NSObject

    4 组合

    优点:*保留了封装性*操作便利

    缺点:*灵活度不够

    生命周期:cpu和computer封装性是独立的,生命周期是一致的,一起存在,一起销毁,高耦合在一起

    5 聚合

    优点*保留了封装性*灵活度高

    缺点:*操作欠佳

    生命周期:cpu和computer生命周期不一致,低耦合,方便操作,方便cpu替换,两个对象,各过各的。

    组合关键代码:

     1 main.m中
     2 //组合关系(一体机)
     3 Computer2* computer2 = [[[Computer2 alloc] init] autorelease];//在初始化时cpu已经设置好了
     4 [computer2 powerOn];
     5 
     6 computer.m中,类实现文件
     7 //init
     8 -(id)init{
     9     if (self = [super init]) {
    10         self.cpu = [[[TRCpu2 alloc] init] autorelease];
    11     }
    12     return self;
    13 }

    聚合关键代码:

     1 main.m中
     2 //聚合关系(台式机)
     3 TRCpu3* cpu = [[[TRCpu3 alloc] init] autorelease];
     4 TRComputer3* computer3 = [[[TRComputer3 alloc] init] autorelease];
     5 computer3.cpu = cpu;//设置cpu
     6 [computer3 powerOn];
     7 
     8 computer.m类实现文件
     9 -(void)powerOn{
    10     NSLog(@"计算机3通电了");
    11     [self.cpu run];
    12     [self start];
    13 }

    回到顶部

    四、多态

    1 多种形态,引用的多种形态。

    对于一个引用变量,可以指向任何类的对象。

    对于一个父类的引用(类与类之间有一种继承关系),可以指向子类,也可以指向本类,指向的类型不同。

    当通过此引用向对象发送消息,调用的方法是不同的,此时方法的调用就是多态。

    2 多态类与类之间是继承关系

    父类的引用可以指向子类的引用或者本类的引用。

    父类的引用指向子类的对象,发送消息,调用的是子类对象的方法。

    父类的引用指向本类的对象,发送消息,调用本类的方法。

    main.m中
    1
    //指向本类 2 TRAnimal* animal = [[[TRAnimal alloc] init] autorelease]; 3 [animal eat]; 4 //指向子类 5 TRAnimal* animal2 = [[[TRDog alloc] init] autorelease]; 6 [animal2 eat];

    3 编译期类型和运行期类型

    *在多态下,父类的引用可以指向子类的引用,当编译的时候,编译器无法确定指向的对象是什么类型,所有编译器会将引用当做父类类型引用编译检查。

    *在调用方法时,发现确实是子类对象,为子类类型创建空间。

    总结:TRAnimal* animal2 = [[[TRDog alloc] init] autorelease];编译时,把TRDog类型当成TRAnimal类型编译。[animal2 eat];运行时,调用的是TRDog类型的对象。

    练习:定义一个交通工具类TRTransortation,有一个能力print输出交通工具的具体信息。

    交通工具TRTexi的士 TRBus巴士 TRBike自行车

    创建五个交通工具,使用多态输出交通工具的信息。

    4 多态可以用在参数

    练习:创建一个学生对象,gotoSchoolByTrans()

    main:创建学生对象,向gotoSchoolByTrans()发送消息,输出,该学生成什么交通工具来上学。

    age:10乘坐的士上学

    age:12乘坐巴士上学

    age:15乘坐自行车上学

     1 main.m
     2 //多态作为参数(引用)
     3 Student* student = [[[Student alloc] init] autorelease];
     4 Student* texi = [[[Texi alloc] init] autorelease];
     5 Student* bus = [[[Bus alloc] init] autorelease];
     6 Student* bike = [[[Bike alloc] init] autorelease];
     7 [student gotoSchoolByTrans:texi andAge:10];
     8 [student gotoSchoolByTrans:bus andAge:12];
     9 [student gotoSchoolByTrans:bike andAge:15];
    10 
    11 student.m实现文件
    12 -(void)gotoSchoolByTrans:(Student *)stu andAge:(int)age{
    13     NSLog(@"age:%d",age);
    14     [stu print];
    15 }

    5 多态可以用在返回值类型,返回值多态

    练习:写一个方法,帮我们创建对象

    传人参数1->的士 2->巴士 3 -> 自行车

     1 main.m
     2 //多态作为返回值
     3 Student* student2 = [Student studentByNum:2];
     4 [student2 print];
     5 
     6 student.m实现文件
     7 +(Student *)studentByNum:(int)num{
     8     switch (num) {
     9         case 1:
    10             return [[[Texi alloc] init] autorelease];
    11             break;
    12         case 2:
    13             return [[[Bus alloc] init] autorelease];
    14             break;
    15         case 3:
    16             return [[[Bike alloc] init] autorelease];
    17             break;
    18             
    19         default:20             break;
    21     }
    22 }

    6 多态用作数组

    1 main.m
    2 //多态作为数组
    3 Student* students[3];
    4 students[0] = [[[Texi alloc] init] autorelease];
    5 students[1] = [[[Bus alloc] init] autorelease];
    6 students[2] = [[[Bike alloc] init] autorelease];
    7 for (int i = 0; i < 3; i++) {
    8      [students[i] print];
    9 }

    7 多态的好处

    可以让我们设计更合理的代码,使代码更通用,使用程序的可维护性和可扩展性更强。

    8 多态特性的展现

    *可以用在方法的参数

    *可以用在方法的返回值类型

    *可以用在数组和集合上

    重构:写出以下类,用最少的代码解决问题,

    TRShape形状类

    TRRectangle矩形类x,y

    TRCircle圆形r

    TRSquare正方形x

    求:周长perimeter与面积area,show方法,查看周长和面积。属性、初始化方法、工厂方法、内存管理、继承。(创建三个对象矩形、圆形、正方形、统一遍历)

    练习:创建一个Person类,show方法,查看艺术品的详细信息,每个艺术品,都用print查看当前艺术品的详细信息,创建三个艺术品,分别查看艺术品的信息。

    Painting(油画):author(作者)、year(年代)、product(艺术品名称)

    Music(音乐):

          Pop(流行):

               product(艺术品名称)、Singer(演唱者)、time(时长)

          Rock(摇滚):

               SingerCount(演唱者人数)

     

    结构:

               Arts(艺术品)

    |-------------------+------------------|

    Painting                        Music

                                |--------+--------|

                                              Pop            Rock

    NSString的使用

    NSString* name = @"zhangsan";

    stu.name = @"zhangsan";

    NSLog(@"%@",stu.name);

    @property(copy) NSString* name;

    练习:创建一个TREmployee类,TRStaff普通职员,TRManager领导,工资salary、工种job、姓名name,方法输出个人信息print,如果相应的工种领导的工资会比普通职员高2000。TRHR类,人力资源,通过参数来招人,最少代码。(多态、初始化、工厂方法、内存管理)

               1软件工程师6000

               2测试工程师4500

               3高级软件工程师8000

               4 软+领 5 测+领 6 高软+领

  • 相关阅读:
    作业三
    作业二
    4.9上机作业
    4.2Java
    Java作业
    第四周上级作业
    第三周作业
    第一次上机练习
    [ZJOI2009]假期的宿舍
    [ZJOI2007]矩阵游戏
  • 原文地址:https://www.cnblogs.com/yangmx/p/3485200.html
Copyright © 2020-2023  润新知