1、里氏转换
1)子类可以赋值给父类,如果一个地方需要父类作为参数,可将子类放进去:
string s = string.Join("|", new string[] { "1", "2", "3" });
PersonInfo p = new Reporter(“Ale”,23,”play”);
2)如果父类中装的是子类对象,那么可以将这个父类强转为对应子类对象
PersonInfo p = new Reporter(“Ale”,23,”play”);
Reporter rep = (Reporter)p;
2、类型转换抛异常处理
1)is:如果转换成功返回true
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 练习
{
class Program
{
static void Main(string[] args)
{
PersonInfo p = new Reporter("Ale", 23, "play");
if (p is Reporter)
{
Reporter rep = (Reporter)p;
rep.Reorting();
}
else
{
Console.WriteLine("转换失败!");
}
Console.ReadKey();
}
}
}
2)as:如果哪个转换,则返回一个对象,否则为null
null:
success:
3、例子
代码冗余,后期可以采用多态
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 里氏转换
{
class Program
{
static void Main(string[] args)
{
//Person person = new Person();
//Student studengt = new Student();
//Beauty beauty = new Beauty();
//Teacher teacher = new Teacher();
Random r = new Random();
Person[] personArray = new Person[10];
for (int i = 0; i < personArray.Length; i++)
{
int rNumber = r.Next(1, 6);
switch (rNumber)//1-5
{
case 1: personArray[i] = new Person();
break;
case 2: personArray[i] = new Student();
break;
case 3: personArray[i] = new Teacher();
break;
case 4: personArray[i] = new Beauty();
break;
case 5: personArray[i] = new Driver();
break;
}
}
for (int i = 0; i < personArray.Length; i++)
{
if (personArray[i] is Driver)
{
((Driver)personArray[i]).DriverSay();
}
else if (personArray[i] is Teacher)
{
((Teacher)personArray[i]).TeacherSay();
}
else if (personArray[i] is Student)
{
((Student)personArray[i]).StudentSay();
}
else if (personArray[i] is Beauty)
{
((Beauty)personArray[i]).BeautySay();
}
else
{
personArray[i].PersonSay();//注意一定要放最后,因为父类是personArray,都是调用自己的方法,放在第一位结果都是PersonSay
}
}
Console.ReadKey();
}
}
public class Person
{
public void PersonSay()
{
Console.WriteLine("我是人");
}
}
public class Student:Person
{
public void StudentSay()
{
Console.WriteLine("我是学生");
}
}
public class Beauty : Person
{
public void BeautySay()
{
Console.WriteLine("我是美女");
}
}
public class Driver : Person
{
public void DriverSay()
{
Console.WriteLine("我是司机");
}
}
public class Teacher:Person
{
public void TeacherSay()
{
Console.WriteLine("我是老师");
}
}
}
4、protected
protected权限比private权限高一些,继承的子类和其他类中能够访问到,如“_name”,但是main函数里不能够访问到。