C#基础(15)——里氏转换、protected

来源:互联网 发布:arm7也是keil编程吗 编辑:程序博客网 时间:2024/06/03 21:05

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函数里不能够访问到。
这里写图片描述