优点
1. 提高代码的重用性,子类拥有父类的方法和属性;
2. 提高代码的可扩展性,子类可形似于父类,但异于父类,保留自我的特性。
类型转换
显示转换:父类对象转换为子类类型必须使用强制转换
case1
Person p = new Person();
Person p1 = new Student ();//转换失败,实际上调用的是父类的方法
case2
Person p = new Person();
Student stu = (Student)p;//转换失败
stu.SayHello();
case3
Person p = new Teacher();
Teacher t = (Teacher)p;//转换成功
t.SayHi();
隐式转换:子类对象转换为父类类型可以直接转
Student stu = new Student();//转换成功
Person p = stu;
p.Show();
关键字is/as转换:
is转换:返回的是bool值,true为能转换,false不能转换。
as转换:使用as转换时,如果转换不了,不报异常,返回值为Null.在调用方法时报异常。
//关键字is转换
Person p = new Student();//父类转换为子类
bool result = p is Teacher;
if(result )
{
Teacher t=(Teacher)p;
}
else
{
Console.WriteLine("转换不了");
}
Console.ReadKey();
//关键字as转换
Teacher t = new Teacher();//子类转换为父类
Person p = t as Person;
p.PerShow();
Person p = new Teacher();//父类转换为子类
Teacher t = p as Teacher;
t.TeaShow();
关键字is转换练习
随机生成类,调取生成类的方法。
static void Main(string[] args)
{
Person[] per = new Person[10];//将类放到一个数组
Random r = new Random();//随机数
for (int i = 0; i < per.Length ; i++)
{
int num = r.Next(1, 7);
switch (num)//依据随机数调取类
{
case 1: per[i]=new Teacher();break;
case 2: per[i] = new Student();break;
case 3: per[i] = new ShuaiGuo();break;
case 4: per[i] = new MeiNv();break;
case 5: per[i] = new YeShou();break;
case 6: per[i] = new Person();break;
}
}
for (int i = 0; i < per.Length ; i++)
{
SayType(per[i]);
}
Console.ReadKey();
}
public static void SayType(Person p)//方法:随机调取类后调用其中的方法
{
if(p is Teacher)
{
((Teacher)p).PerShow();
}
else if(p is Student )
{
((Student)p).StuShow();
}
else if(p is ShuaiGuo)
{
((ShuaiGuo)p).shuaiShow();
}
else if(p is MeiNv)
{
((MeiNv)p).MeiShow();
}
else if(p is YeShou)
{
((YeShou)p).YeShow();
}
else if (p is Person)
{
((Person)p).PerShow();
}
}