C#里氏转换/is/as

【里氏转换】两原则:

(1)子类可以赋值给父类,但父类不会有子类的字段、属性、方法(如果有一个地方需要一个父类作为参数,我们可以用一个子类代替)

         string str =string.Join("|",new string[] { "1", "2","3", "4" });

          Join第二参数为Object类,它是父类,此时我们可以用string子类来代替父类

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

注:如果一个子类继承了一个父类,那么这个子类除了可以使用自己的成员外,还可以使用从父类那里继承过来的成员。但是父类永远都只能使用自己的成员,而不能使用子类的成员。

【is和as】

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

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

举例is:

          Person p = new Student();

          if (p is Student)

           {

                   Console.WriteLine("可以转成Student类");

           }

           else

           {

                    Console.WriteLine("不可以转成Student类");

           }

举例as:

        Person p = new Student();

           Student t = p as Student;

里氏转换实例代码演示:

        其中给Person数据赋值用到了里氏转换第一条:子类可以赋值给父类,后面将Person数组里面的成员用is进行类型转换用到了里氏转换第二条:父类若存的是子类的对象,可以将父类转成对应的子类。

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

namespace _里氏转换练习
{
    class Program
    {
        static void Main(string[] args)
        {
            Person[] pers = new Person[10];  //生成Person数组,然后随机给它赋值
            Random r = new Random();
            for (int i = 0; i < pers.Length; i++)
            {
                int rNumber = r.Next(1, 7);
                switch (rNumber)
                {
                    case 1:
                        pers[i] = new Student();
                        break;
                    case 2:
                        pers[i] = new Teacher();
                        break;
                    case 3:
                        pers[i] = new ShuaiGuo();
                        break;
                    case 4:
                        pers[i] = new YeShou();
                        break;
                    case 5:
                        pers[i] = new MeiLv();
                        break;
                    case 6:
                        pers[i] = new Person();
                        break;
                }
            }
            for (int i = 0; i < pers.Length; i++)
            {
                if (pers[i] is Student)
                {
                    ((Student)pers[i]).StudentSayHi();
                }
                else if (pers[i] is Teacher)
                {
                    ((Teacher)pers[i]).TeacherSayHi();
                }
                else if (pers[i] is ShuaiGuo)
                {
                    ((ShuaiGuo)pers[i]).ShuaiGuoSayHi();
                }
                else if (pers[i] is YeShou)
                {
                    ((YeShou)pers[i]).YeShouSayHi();
                }
                else if (pers[i] is MeiLv)
                {
                    ((MeiLv)pers[i]).MeiLvSayHi();
                }
                else
                {
                    pers[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 MeiLv : Person
        {
            public void MeiLvSayHi()
            {
                Console.WriteLine("我是美女");
            }
        }

        public class ShuaiGuo : Person
        {
            public void ShuaiGuoSayHi()
            {
                Console.WriteLine("我是帅哥");
            }
        }

        public class YeShou : Person
        {
            public void YeShouSayHi()
            {
                Console.WriteLine("我是野兽");
            }
        }
    }
}
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值