C# 里氏转换

C# 里氏转换

1.里氏转换

主要记住下面两句精华,写代码的过程中经常用到里氏转换
(1)子类可以赋值给父类;如果有一个地方需要一个父类作为参数,我们可以给一个子类代替.
举个小例子说明一下:

  //下面这个Join函数,第一个值是string类型,第二个是“params object[] values”
string s = "abcdefg";
char[] chs = s.ToCharArray();//char[] 数组属于object[] values的子类,因为object是所有类的基类
string str = string.Join("|", chs);//第一个值是string类型,第二个是“params object[] values”
Console.WriteLine(str);
Console.ReadKey();

(2)如果父类中装的是子类对象,那么可以将这个父类强转换为子类对象
例子如下

主程序:

Student student = new Student();//student是子类
Person person = student;//子类可以赋值给父类

上面这两句代码可以简写成:

 Person person = new Student();//父类中装的是子类对象
 //new Student() 创建子类对象

接着:

Person person = new Student();//父类中装的是子类对象
Student s = (Student)person;//父类强转换为子类对象
s.StudentSayHello();//输出我是学生
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 TeacherSayHello()
        {
            Console.WriteLine("我是老师");
        }
    }

(3)is表示类型转换,如果能够转换成功,则返回一个true,否则返回一个true

Person p = new Student();
if (p is Teacher)
{
Teacher teacher = (Teacher)p;
teacher.TeacherSayHello();
Console.ReadKey();
}
else
{
 Console.WriteLine("转换失败");
 Console.ReadKey();//这个例子输出的是false
}

(4)as也表示类型转换,如果能够转换则返回对应的对象,否则返回一个null

Person p = new Student();
Teacher teacher = p as Teacher;
Console.ReadKey();//此时的teacher为null

Person p = new Student();
Student student = p as Student;
student.StudentSayHello();
Console.ReadKey();//可以调用方法

(5)里氏转换小练习,直接附上代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _02_里氏转换练习
{
    internal class Program
    {
        static void Main(string[] args)
        {  //里氏转换:子类可以赋值给父类
            Person[] p = new Person[10];
            Random r = new Random();
            
            for (int i = 0; i < p.Length; i++)
            {
               int num= r.Next(1, 7);
                //里氏转换:子类可以赋值给父类
                switch (num) { 
                
                case 1:
                        p[i] = new Person();
                        break;
                    case 2:
                        p[i] = new Student();
                        break;
                    case 3:
                        p[i] = new Teacher();
                        break;
                    case 4:
                        p[i] = new Meinv();
                        break;
                    case 5:
                        p[i] = new Shuaige();
                        break;
                    case 6:
                        p[i] = new Monster();
                        break;
                }
            }


           // 如果父类中装的是子类对象,那么可以将这个父类强转换为子类对象
            for (int i = 0; i < p.Length; i++)
            {
              
                if (p[i] is Student)
                {
                    ((Student)p[i]).StudentSayHi();

                }
                else if (p[i] is Meinv)
                {
                    ((Meinv)p[i]).MeinvSayHi();
                }
                else if (p[i] is Shuaige)
                {
                    ((Shuaige)p[i]).ShuaigeSayHi();
                }
                else if (p[i] is Monster)
                {
                    ((Monster)p[i]).MonsterSayHi();
                }
                else if (p[i] is Teacher)
                {
                    ((Teacher)p[i]).TeacherSayHi();
                }
                else { p[i].PersonSayHi(); }
            }

            Console.ReadKey();
        }
    }

    public class Person 
    {
        public void PersonSayHi()
        { 
            Console.WriteLine("我是人类");
        }
    }
    public class Student : Person
    {
        public void StudentSayHi()
        {
            Console.WriteLine("我是学生");
        }
    }
    public class Teacher : Person
    {
        public void TeacherSayHi()
        {
            Console.WriteLine("我是老师");
        }
    }
    public class Meinv : Person
    {
        public void MeinvSayHi()
        {
            Console.WriteLine("我是美女");
        }
    }
    public class Shuaige : Person
    {
        public void ShuaigeSayHi()
        {
            Console.WriteLine("我是帅哥");
        }
    }
    public class Monster:Person
    {
        public void MonsterSayHi()
        {
            Console.WriteLine("我是野兽");
        }
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值