using关键字有什么用?什么是IDisposable?

using可以声明namespace的引入,还可以实现非托管资源的释放,实现了IDisposiable的类在using中创建,using结束后会自动调用该对象的Dispose方法,释放资源。加分的补充回答:using其实等价于try……finally,用起来更方便。

里氏转换

(1).子类可以赋值给父类

(2).如果父类中装的是子类对象,那么可以将这个父类强制转换为子类对象.

得出结论:子类对象可以调用父类的成员,但是父类只能调用自己的成员.

注:子类可以转换成父类有什么意义?

有时候,有的地方需要一个父类对象,这个时候,我们可以使用这个父类的一个子类

来代替.(因为子类可以赋值给父类.)

对于里氏转换的判断

is   表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false

is的使用方法:

  1. if (p1 is Tether)
  2. {
  3. Tether t1 = (Tether)p1;
  4. t1.TetherSayHello();
  5. }
  6. else
  7. {
  8. Console.WriteLine("转换失败");
  9. }

as  表示类型转换,如果能够转换转换成功,则返回对应的对象,否则返回一个null.

as的使用方法:

  1. Student s3 = p1 as Student;
  2. s3.StudentSayHello();


里氏转换的练习01:
  1. namespace _02.里氏装换的练习
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. /*
  8. 自己定义一个父类Person,两个子类Teacher和Student类.
  9. Person写一个有参数的构造方法.
  10. */
  11. /*
  12. 自己试试,子类可以自动转父类,父类转子类要通过强转.
  13. 为了不出错,可以先通过is判断或用as转换.
  14. */
  15. Person p1;
  16. Student s1 = new Student("张三", 18, '男');
  17. if (s1 is Person) //使用is进行转换
  18. {
  19. p1 = s1;
  20. Console.WriteLine("转换成功");
  21. }
  22. else
  23. {
  24. Console.WriteLine("转换失败");
  25. }
  26. Person p2;
  27. Teacher t1 = new Teacher("小兰", 16, '女');
  28. p2 = t1 as Person; //使用as进行转换
  29. if (p2 != null)
  30. {
  31. Console.WriteLine("转换成功");
  32. }
  33. else
  34. {
  35. Console.WriteLine("转换失败");
  36. }
  37. Console.ReadKey();
  38. }
  39. }
  40. public class Person
  41. {
  42. public Person(string name, int age, char gender)
  43. {
  44. this.Name = name;
  45. this.Age = age;
  46. this.Gender = gender;
  47. }
  48. private string _name;
  49. public string Name
  50. {
  51. get
  52. {
  53. return _name;
  54. }
  55. set
  56. {
  57. _name = value;
  58. }
  59. } //Name属性定义结束
  60. public int Age
  61. {
  62. get
  63. {
  64. return _age;
  65. }
  66. set
  67. {
  68. _age = value;
  69. }
  70. } //Age属性定义结束
  71. public char Gender
  72. {
  73. get
  74. {
  75. return _gender;
  76. }
  77. set
  78. {
  79. _gender = value;
  80. }
  81. } //_gender属性定义结束
  82. private int _age;
  83. private char _gender;
  84. public void PersonSayHello()
  85. {
  86. Console.WriteLine("我是父类");
  87. }
  88. } //Person 类定义结束
  89. public class Student:Person
  90. {
  91. public Student(string name, int age, char gender):base(name,age, gender)
  92. {
  93. }
  94. public void StudentSayHello()
  95. {
  96. Console.WriteLine("我是学生");
  97. }
  98. }//Student 类定义结束
  99. public class Teacher : Person
  100. {
  101. public Teacher(string name, int age, char gender) : base(name, age, gender)
  102. {
  103. }
  104. public void TeacherSayHello()
  105. {
  106. Console.WriteLine("我是老师");
  107. }
  108. }
  109. }
 
里氏转换的练习02:
  1. namespace _03.子类赋值给父类的练习01
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. Person[] p1 = new Person[10];
  8. Random r = new Random();
  9. int random = 0; //保存随机数
  10. for (int i = 0; i < p1.Length; i++)
  11. {
  12. random=r.Next(1, 7); //从1`6随机产生一个数
  13. switch (random)
  14. {
  15. case 1:
  16. p1[i] = new Student();
  17. break;
  18. case 2:
  19. p1[i] = new Teacher();
  20. break;
  21. case 3:
  22. p1[i] = new MeiLv();
  23. break;
  24. case 4:
  25. p1[i] = new YeShou();
  26. break;
  27. case 5:
  28. p1[i] = new ShuaiGuo();
  29. break;
  30. case 6:
  31. p1[i] = new Person ();
  32. break;
  33. }
  34. }
  35. for (int i = 0; i < p1.Length; i++)
  36. {
  37. if (p1[i] is Student)
  38. {
  39. ((Student)p1[i]).StudentSayHello();
  40. }
  41. else if (p1[i] is Teacher)
  42. {
  43. ((Teacher)p1[i]).ThacherSayHello();
  44. }
  45. else if (p1[i] is MeiLv)
  46. {
  47. ((MeiLv)p1[i]).MeiLvSayHello();
  48. }
  49. else if (p1[i] is Person)
  50. {
  51. p1[i].PersonSayHello();
  52. }
  53. else if (p1[i] is YeShou)
  54. {
  55. ((YeShou)p1[i]).YeShouSayHello();
  56. }
  57. else if (p1[i] is ShuaiGuo)
  58. {
  59. ((ShuaiGuo)p1[i]).ShuaiGuoSayHello();
  60. }
  61. }
  62. Console.ReadKey();
  63. }
  64. }
  65. public class Person
  66. {
  67. public void PersonSayHello()
  68. {
  69. Console.WriteLine("我是人类");
  70. }
  71. }
  72. public class Student : Person
  73. {
  74. public void StudentSayHello()
  75. {
  76. Console.WriteLine("我是学生");
  77. }
  78. }
  79. public class Teacher : Person
  80. {
  81. public void ThacherSayHello()
  82. {
  83. Console.WriteLine("我是老师");
  84. }
  85. }
  86. public class YeShou : Person
  87. {
  88. public void YeShouSayHello()
  89. {
  90. Console.WriteLine("我是野兽");
  91. }
  92. }
  93. public class ShuaiGuo:Person
  94. {
  95. public void ShuaiGuoSayHello()
  96. {
  97. Console.WriteLine("我是帅锅");
  98. }
  99. }
  100. public class MeiLv:Person
  101. {
  102. public void MeiLvSayHello()
  103. {
  104. Console.WriteLine("我是美女");
  105. }
  106. }
  107. }

01.里氏准换与using关键字的更多相关文章

  1. Java学习笔记 01 基本数据类型、标识符、关键字和运算符

    一.基本数据类型 基本数据类型 数据类型 内存空间(8位等于1字节) 取值范围 备注 byte 8位 -128~127   short 16位 -32768~32767   int 32位 -2147 ...

  2. Jaxb解析xml准换为javabean

    先说下这个的背景吧,前些日子,有个以前的小同事说刚接触webservice,想解析下xml,记得我学的时候还是dom4j,sax的解析方式,最近看别人的代码用的jaxb的方式,觉得注解起来很简练,所以 ...

  3. python 爬虫数据准换时间格式

    timeStamp = 1381419600 dateArray = datetime.datetime.utcfromtimestamp(timeStamp) otherStyleTime = da ...

  4. C#读取Excel文件,准换为list

    经常会用到,废话不多说直接贴代码 //读取Excel文件 public static DataTable ReadExcelToTable(string path)//excel存放的路径{try{ ...

  5. 002_JS基础_JavaScript基础语法01

    2.1 注释 单行注释: 在某一行使用"//"(两条斜线)可以把斜线之后的内容进行注释:多行注释: 使用"/* 这是要注释的内容 */"可以进行多行注释: /* ...

  6. mysql删除表结构中的“关键字”字段

    问题描述:一同事误将“describe”关键字放入建表语句中,虽成功建表,但因未关键词的缘故,无法插入数据.故需将字段drop并换为非关键字的字段. 解决过程: 按常规删除字段语句操作报错,语句如下: ...

  7. Java研发工程师知识点总结

    Java研发工程师知识点总结 最近一次更新2017年12月08日 大纲 一.Java基础(语言.集合框架.OOP.设计模式等) 二.Java高级(JavaEE.框架.服务器.工具等) 三.多线程和并发 ...

  8. java面试题汇总(1)

    1)Java 中能创建 volatile 数组吗? 能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组.我的意思是,如果改变引用指向的数组, 将会受到 v ...

  9. S2---深入.NET平台和C#编程的完美总结

    1.NET简单解说 l 面向对象提升 OOP(Object Oriented  Programming)面向对象编程 AOP:(Aspache  Oriented Programming):面向切面编 ...

随机推荐

  1. Kubernetes -- Server 部署

    1.  Node 节点配置文件 1.1 下载相关的软件 wget https://dl.k8s.io/v1.13.1/kubernetes-server-linux-amd64.tar.gz wget ...

  2. node.js安装以及git 的使用说明

     第一步:安装node.js: Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.   Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高 ...

  3. 【微服务】之七:轻松搞定SpringCloud微服务-API权限控制

    权限控制,是一个系统当中必须的重要功能.张三只能访问输入张三的特定功能,李四不能访问属于赵六的特定菜单.这就要求对整个体系做一个完善的权限控制体系.该体系应该具备针区分用户.权限.角色等各种必须的功能 ...

  4. Spark操作—aggregate、aggregateByKey详解

    https://blog.csdn.net/u013514928/article/details/56680825 1. aggregate函数 将每个分区里面的元素进行聚合,然后用combine函数 ...

  5. SHELL编程之条件判断

    一.if 语句结构 (1)单分支语句结构 if  条件测试操作 then  命令序列 fi #!/bin/bash MOUNT_DIR="/media/cdrom/" #-d $M ...

  6. MySQL事务及事务隔离级别 锁机制

    什么是事务? 当多个用户访问同一份数据时,一个用户在更改数据的过程中可能有其他用户同时发起更改请求,为保证数据库记录的更新从一个一致性状态更改为另一个一致性状态,这样的操作过程就是事务.事务具有的AC ...

  7. 【转】org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be res

    如图所示: 看网上的解决方案,有的说是jstl的版本问题,1.0版本引入使用的时候加的uri不带有jsp路径的,1.2的带有/jsp路径,还有的说是依赖冲突的问题,最后尝试了都不行,只有一招能够行的通 ...

  8. C# 一些请求的基类(待补充)

    using System.Runtime.Serialization; /// <summary> /// 通用分页请求类 /// </summary> [DataContra ...

  9. 1095 解码PAT准考证 (25 分)

    PAT 准考证号由 4 部分组成: 第 1 位是级别,即 T 代表顶级:A 代表甲级:B 代表乙级: 第 2~4 位是考场编号,范围从 101 到 999: 第 5~10 位是考试日期,格式为年.月. ...

  10. 有用的 Angular CLI 命令参数

    这是一些有用的 Angular 5 CLI 命令参数,注意参数前面的-和--的不同... 1. 指定build的输出为production version,合并优化css and js files. ...