01.里氏准换与using关键字
using关键字有什么用?什么是IDisposable?
using可以声明namespace的引入,还可以实现非托管资源的释放,实现了IDisposiable的类在using中创建,using结束后会自动调用该对象的Dispose方法,释放资源。加分的补充回答:using其实等价于try……finally,用起来更方便。
里氏转换
(1).子类可以赋值给父类
(2).如果父类中装的是子类对象,那么可以将这个父类强制转换为子类对象.
得出结论:子类对象可以调用父类的成员,但是父类只能调用自己的成员.
注:子类可以转换成父类有什么意义?
有时候,有的地方需要一个父类对象,这个时候,我们可以使用这个父类的一个子类
来代替.(因为子类可以赋值给父类.)
对于里氏转换的判断
is 表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false
is的使用方法:
if (p1 is Tether)
{
Tether t1 = (Tether)p1;
t1.TetherSayHello();
}
else
{
Console.WriteLine("转换失败");
}
as 表示类型转换,如果能够转换转换成功,则返回对应的对象,否则返回一个null.
as的使用方法:
Student s3 = p1 as Student;
s3.StudentSayHello();
namespace _02.里氏装换的练习
{
class Program
{
static void Main(string[] args)
{
/*
自己定义一个父类Person,两个子类Teacher和Student类.
Person写一个有参数的构造方法.
*/
/*
自己试试,子类可以自动转父类,父类转子类要通过强转.
为了不出错,可以先通过is判断或用as转换.
*/
Person p1;
Student s1 = new Student("张三", 18, '男');
if (s1 is Person) //使用is进行转换
{
p1 = s1;
Console.WriteLine("转换成功");
}
else
{
Console.WriteLine("转换失败");
}
Person p2;
Teacher t1 = new Teacher("小兰", 16, '女');
p2 = t1 as Person; //使用as进行转换
if (p2 != null)
{
Console.WriteLine("转换成功");
}
else
{
Console.WriteLine("转换失败");
}
Console.ReadKey();
}
}
public class Person
{
public Person(string name, int age, char gender)
{
this.Name = name;
this.Age = age;
this.Gender = gender;
}
private string _name;
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
} //Name属性定义结束
public int Age
{
get
{
return _age;
}
set
{
_age = value;
}
} //Age属性定义结束
public char Gender
{
get
{
return _gender;
}
set
{
_gender = value;
}
} //_gender属性定义结束
private int _age;
private char _gender;
public void PersonSayHello()
{
Console.WriteLine("我是父类");
}
} //Person 类定义结束
public class Student:Person
{
public Student(string name, int age, char gender):base(name,age, gender)
{
}
public void StudentSayHello()
{
Console.WriteLine("我是学生");
}
}//Student 类定义结束
public class Teacher : Person
{
public Teacher(string name, int age, char gender) : base(name, age, gender)
{
}
public void TeacherSayHello()
{
Console.WriteLine("我是老师");
}
}
}

namespace _03.子类赋值给父类的练习01
{
class Program
{
static void Main(string[] args)
{
Person[] p1 = new Person[10];
Random r = new Random();
int random = 0; //保存随机数
for (int i = 0; i < p1.Length; i++)
{
random=r.Next(1, 7); //从1`6随机产生一个数
switch (random)
{
case 1:
p1[i] = new Student();
break;
case 2:
p1[i] = new Teacher();
break;
case 3:
p1[i] = new MeiLv();
break;
case 4:
p1[i] = new YeShou();
break;
case 5:
p1[i] = new ShuaiGuo();
break;
case 6:
p1[i] = new Person ();
break;
}
}
for (int i = 0; i < p1.Length; i++)
{
if (p1[i] is Student)
{
((Student)p1[i]).StudentSayHello();
}
else if (p1[i] is Teacher)
{
((Teacher)p1[i]).ThacherSayHello();
}
else if (p1[i] is MeiLv)
{
((MeiLv)p1[i]).MeiLvSayHello();
}
else if (p1[i] is Person)
{
p1[i].PersonSayHello();
}
else if (p1[i] is YeShou)
{
((YeShou)p1[i]).YeShouSayHello();
}
else if (p1[i] is ShuaiGuo)
{
((ShuaiGuo)p1[i]).ShuaiGuoSayHello();
}
}
Console.ReadKey();
}
}
public class Person
{
public void PersonSayHello()
{
Console.WriteLine("我是人类");
}
}
public class Student : Person
{
public void StudentSayHello()
{
Console.WriteLine("我是学生");
}
}
public class Teacher : Person
{
public void ThacherSayHello()
{
Console.WriteLine("我是老师");
}
}
public class YeShou : Person
{
public void YeShouSayHello()
{
Console.WriteLine("我是野兽");
}
}
public class ShuaiGuo:Person
{
public void ShuaiGuoSayHello()
{
Console.WriteLine("我是帅锅");
}
}
public class MeiLv:Person
{
public void MeiLvSayHello()
{
Console.WriteLine("我是美女");
}
}
}
01.里氏准换与using关键字的更多相关文章
- Java学习笔记 01 基本数据类型、标识符、关键字和运算符
一.基本数据类型 基本数据类型 数据类型 内存空间(8位等于1字节) 取值范围 备注 byte 8位 -128~127 short 16位 -32768~32767 int 32位 -2147 ...
- Jaxb解析xml准换为javabean
先说下这个的背景吧,前些日子,有个以前的小同事说刚接触webservice,想解析下xml,记得我学的时候还是dom4j,sax的解析方式,最近看别人的代码用的jaxb的方式,觉得注解起来很简练,所以 ...
- python 爬虫数据准换时间格式
timeStamp = 1381419600 dateArray = datetime.datetime.utcfromtimestamp(timeStamp) otherStyleTime = da ...
- C#读取Excel文件,准换为list
经常会用到,废话不多说直接贴代码 //读取Excel文件 public static DataTable ReadExcelToTable(string path)//excel存放的路径{try{ ...
- 002_JS基础_JavaScript基础语法01
2.1 注释 单行注释: 在某一行使用"//"(两条斜线)可以把斜线之后的内容进行注释:多行注释: 使用"/* 这是要注释的内容 */"可以进行多行注释: /* ...
- mysql删除表结构中的“关键字”字段
问题描述:一同事误将“describe”关键字放入建表语句中,虽成功建表,但因未关键词的缘故,无法插入数据.故需将字段drop并换为非关键字的字段. 解决过程: 按常规删除字段语句操作报错,语句如下: ...
- Java研发工程师知识点总结
Java研发工程师知识点总结 最近一次更新2017年12月08日 大纲 一.Java基础(语言.集合框架.OOP.设计模式等) 二.Java高级(JavaEE.框架.服务器.工具等) 三.多线程和并发 ...
- java面试题汇总(1)
1)Java 中能创建 volatile 数组吗? 能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不是整个数组.我的意思是,如果改变引用指向的数组, 将会受到 v ...
- S2---深入.NET平台和C#编程的完美总结
1.NET简单解说 l 面向对象提升 OOP(Object Oriented Programming)面向对象编程 AOP:(Aspache Oriented Programming):面向切面编 ...
随机推荐
- 设置使用的python版本
一.查看当前使用的python版本,或设置使用的python版本 二.python2中默认使用ASCII码,无法识别中文,报错如图,解决办法,设置字符集为utf-8
- node.js安装以及git 的使用说明
第一步:安装node.js: Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高 ...
- 【bzoj2500】幸福的道路 树形dp+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
- 1. C语言对文件的操作
1. 文件常见输入输出函数与屏幕.键盘输入输出函数的对比,如:fprintf.fscanf等. #define _CRT_SECURE_NO_WARNINGS #include <stdio.h ...
- ansible基本模块-copy
ansible XXX -m copy -a “src=XXX dest=XXX owner=root group=root mode=0755”
- Domoticz 接入苹果的 HomeKit 实现 Siri 控制
前言 接上次的折腾,这次尝试将 Domoticz 接入到苹果的 HomeKit,也就是在 iPhone 的 Siri 中可以语音控制.参考官方文档 步骤 安装 nodejs curl -sL http ...
- php 常用字符集
ASCII 字符集 单字节编码,7位(bits)表示一个字符,共128字符 包含内容 控制字符:回车键.退格.换行键等. 可显示字符:英文大小写字符.阿拉伯数字和西文符号 ANSI 码 ANSI编码 ...
- C++_函数1-编程的基本模块函数
以下是<C++ Primer Plus>中第七章的内容: 使用C++函数的3个步骤: 提供函数定义 提供函数原型 调用函数 7.1.1 定义函数 函数分成两类:没有返回值的函数.有返回值的 ...
- PIE SDK大气校正
1. 算法功能简介 大气校正的目的消除大气对太阳和来自目标的辐射产生吸收和散射作用的 影响,从而获得目标反射率.辐射率.地表温度等真实物理模型参数.大多数情 况下,大气校正同时也是反演地物真实反射率的 ...
- 设计模式学习总结(五)创建者模式(Builder)
创建者模式,主要针对某些产品有类似的生产步骤,且有需要有先后顺序的进行各个部件的生成. 一.示例展示: 通过学习及总结,以下是我完成的创建者模式的示例: 1.创建产品类:Laptop public c ...