黑马程序员 - 学习笔记4 里式转换原则的学习

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com

里式转换原则的学习

通过学习,掌握了里式转换原则。

里式转换原则
(1)子类可以直接赋值给父类
(2)父类可以强制类型转换为“对应”的子类
里式转换原则的存在价值就是用来实现多态


我们先来谈谈第一点,什么叫做子类可以直接赋值给父类呢?我们配合代码来看:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace 里氏转换原则
{
    class Program
    {
        static void Main(string[] args)
        {
            Chinese c1 = new Chinese();//创建一个 Chinese 对象  
            c1.Name = "Mr Lucky";
            Person p1 = c1;//子类直接赋值给父类


        }
    }


    class Person//定义一个Person类  所有类的父类
    {
        string name;//定义一个 name 字段


        public string Name
        {
            get { return name; }
            set { name = value; }
        }


    }

    class Chinese : Person//定义一个类,中国人   继承自Person类
    {
        public void SayHello()
        {
            Console.WriteLine("你好,我是中国人!");
        }
 
    }

    class American : Person//定义一个类,美国人    继承自Person类
    {
        public void SayHello()
        {
            Console.WriteLine("你好,我是美国人!");
        }
    }

    class Japanese : Person//定义一个类,日本人   继承自Person类
    {
        public void SayHello()
        {
            Console.WriteLine("你好,我是日本人!");
        }
    }
}

我们创建了一个 Person 父类,后面分别写了3个子类,都继承自 Person 类,接着,在主方法中创建了一个 Chinese 类的对象,并将继承自父类的字段 name 赋值,最后,直接将创建好了的对象 c1 赋值给 Person 类,

也就是直接将子类直接赋值给父类,调试代码发现,没有任何错误,这也就实现了里氏转换原则中的 “子类可以直接赋值给父类”。

我们创建了三个子类,如何统一管理呢?总不能new 一个子类,然后再 Person p=XX XX,这样很麻烦,我们还可以用数组将他们统一起来:

static void Main(string[] args)
        {
            Chinese c1 = new Chinese();
            c1.Name = "幸运先生";


            American a1 = new American();
            a1.Name = "Mr lucky";


            Japanese J1 = new Japanese();
            J1.Name = "にねのせ";


            Person[] per = { c1,a1,J1};
        }
现在,我们将 Chinese 类, American 类, Japanese 类都赋给了 Person 类,那么,现在这三个子类是什么类型的呢?在这里,三个子类就是 Person 类型的了。
还要和大家说明的是,父类只能访问父类的成员,我们看图:

在里氏转换原则第一条当中,子类直接可以赋值给父类,所以可以直接将 c1、a1、J1 存入 person类型 的数组当中,首先我们知道 Person[0] 代表的是 Chinese 类,也就是 c1 ,此时的 c1 因为直接赋值给了父类,所以是 Person 类型,也就造成了我们在用 per[0] 点的时候,只点出了 name 字段的属性 Name,而 Chinese 中的 SayHello() 方法是无法点出来的,这也就是我刚才说的,父类只能访问父类的成员。




但是我现在就想调用子类中 SayHello(),怎么办呢? 这就使用到了我们里氏转换原则中的第二条,指向子类的父类,可以强制转换为对应的子类。强制转换,大家应该都会吧!


看下面如何进行强制转换:

  Person[] per = { c1,a1,J1};
            //per[0]. 父类只能访问父类的成员  无法访问子类的成员,想要访问 可以进行强制转换  里氏原则中的第二条
            ((Chinese)per[0]).SayHello();
            Console.ReadKey();

得到的结果:


里氏原则第二条, 指向子类的父类,可以强制转换为对应的子类,当我们进行强制转换以后,那么现在的 per[0] 就不在是 person 类型的了,而是 Chinese 类型的,所以我们可以点出 SayHello() 方法。

我把代码改一下:
(( American)per[0]).SayHello();

上面是将 per[0] 强制转换成 Chinese 类,我们发现是可以的,那么,当我改成 American 的时候,可不可以呢!调试一下:


调试之后,发现报错了…… 为什么可以强制转换成 Chinese 类型,不可以强制转换成 American 类型呢?我们来分析一下:


再看一遍里氏转换原则第二点:


指向子类的父类,可以强制转换为对应的子类。


仔细看,可以强制转换为 对应 的子类,我将 对应 加粗了一下并下划线,记住:对应、对应 。


在 per[0] 这块区域中我们预存的是 Chinese 类型的对象 c1,并不是 American 类型的 a1,我们想将 per[0] 强制转换,就只能转换成 Chinese 类型,因为我们原本在 per[0]中存的就是 Chinese 类型的对象,这也遵循了里氏转换原则第二条“指向子类的父类,可以强制转换为对应的子类”,记住,对应,对应。

 per[1] 、per[2] 也只能对应的强制转换成 American 类型 和 Japanese 类型。


通过以上的例题学习后我的感想


问题一 什么是强制类型转换(显示转换)    

简单表达就是  

double x = 123.11

int y = (int)x

问题二 哪一个是对应的子类

上面提到per[]数组是person类型,而数组中的c1是Chinese类型   //(声明(new) c1 的时候就确定了c1是 chinese类 型,由于将c1加入到person数组中,所以变成person类型)

如果要将person类强制转换成子类,必须转换成对应的子类,比如per[0]是 Chinese类型,per[1]是American类型


到目前为止,对代表复杂多态的里式转换原则,有了初步的了解,能够懂得原则中所谓的两个基础点。

需要在以后的实际操作中,巩固此知识点。

---------------------- ASP.Net+Unity开发.Net培训、期待与您交流! ----------------------详细请查看:www.itheima.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值