01.里氏准换与using关键字
2024-09-02 09:40:55
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();
里氏转换的练习01:
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("我是老师");
}
}
}
里氏转换的练习02:
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("我是美女");
}
}
}
最新文章
- Chrome-Console( Command Line API Reference)
- html 上传预览图片
- Shell父进程获取子进程的变量值
- HealthKit框架
- [6] 智能指针boost::weak_ptr
- 超微 X9DRL-iF 服务器主板简介 BIOS相关图解
- android学习笔记36——使用原始XML文件
- C# 16进制与字符串、字节数组之间的转换(转)
- Hello World深入理解
- Java数字、货币值和百分数等的格式化处理
- android圆角View实现及不同版本号这间的兼容
- React——组件的生命周期函数
- Eclipse 枚举类报错
- 对scrapy经典框架爬虫原理的理解
- 知识小罐头05(tomcat8请求源码分析 上)
- Luogu3825 NOI2017 游戏 2-SAT
- jeecg好用吗,看看大家的评价
- 20169207《Linux内核原理与分析》第八周作业
- 通过shell脚本来rerun一个oozie调度失败的job,从而可以跳过执行失败的节点
- 关于Kafka幂等producer的讨论
热门文章
- [Swift实际操作]九、完整实例-(2)在Xcode 10中创建新项目
- application的使用(实现计数器)
- Reviewing notes 1.1 of Advanced algebra
- SDUT OJ 数据结构上机测试1:顺序表的应用
- How to: Create a Business Model in the XPO Data Model Designer
- phpmyadmin更改用户名和密码
- 安装jdk1.8,编写环境变量
- CentOS 中 redis 安装
- npm install时 报错Maximum call stack size exceeded
- c# MVC返回小驼峰Json(首字母小写)