不一样的“父子关系”

学过C#的人都应该知道,C#里面有一种特殊的父子关系,那就是里氏转换,这个转换关系很重要,熟练的学会了这项技能,不仅能让自己的代码量大大减小,同时还都能调用各种类,让自己的代码在这个大平台上舞动起来,那么这么神奇的转换,到底是怎么回事呢?让我们走进下面的正文吧!

注意:里氏转换是建立的继承的基础上,所以我们先来学习一下继承

继承

**定义:**可以理解为遗传,例如:儿子遗传了父亲的一些特征,在这里同样适用,子类可以继承父类的一些属性和方法。

语法结构:
子类名称:父类名称

举例:
父类

public class Person
    {
        public Person(string name, char gender, int age)
        {
            this._name = name;
            this._gender = gender;
            this._age = age;
        }
        private string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        private int _age;
        public int Age
        {
            get { return _age; }
            set { _age = value; }
        }
        private char _gender;
        public char Gender
        {
            get { return _gender; }
            set { _gender = value; }
        }

子类

 public class Teacher: Person//表示teacher类继承了person类
    {
        public Teacher(string name,int age,char gender,int salary):base(name,gender,age)//默认是调用父类中无参数的构造函数
        {
            this.Name = name;
            this.Age = age;
            this.Gender = gender;
            this.salary = salary;
        }
        int _salary;

        public int salary
        {
            get { return _salary;}
            set { _salary = value;}
        }
        public void SayHi()
        {
            Console.WriteLine("{0}岁的{1}在传智博客是最纯洁的{2}老师", this.Age, this.Name, this.Gender);
        }
    }

继承有两大特性:
1、单根性:父类只能有一个
2、传递性:子类可以有很多

其实继承理解起来是比较容易的,那么接下来让我们看看父类和子类之间的转换

里氏转换(父类和子类之间的转换)

分为以下四种情况:

第一种情况: 父类不能转换为子类

  //Person p = new Person();//实例化对象
        //Teacher t = new Teacher();//实例化对象
        //Student stu = (Student)p;//父类对象不能直接转换子类
        //stu.SayHello();

解说:父类不能转换为子类,也不能强制转换成子类,就像是父亲再也变不成儿子,这么理解可以帮助我们加深对这种情况的理解

第二种情况:可以强制转换

        //Person p = new Teacher();
        //Teacher t = (Teacher)p;//如果new的是子类,那么在转换这个子类的时候可以
        //t.SayHi();

注意:new的子类和强制转换的子类必须是同一类。就像是一个父亲有一个儿子,这个儿子可以叫这个名字,也可以叫别的名字

第三种情况:不能转化

        //Person p = new Teacher();
        //Student str = (Student)p;//如果new的是子类,转换的时候转到另一个子类,报异常
        //str.SayHello();

注意:这种转换不能实现,类比一个父亲有个儿子,不能随随便便让他把自己的儿子和其他人的儿子转换。

第四种情况:子类隐式转换父类

        //Student stu = new Student();
        //Person p = stu;//子类最终会转换成父类,所以这种情况可以,不会报错
        //p.show();

解说:我们都知道儿子终究有一天会变成父亲,但是父亲在也不会变成儿子了,所以子类变成父类不需要强制转换也能实现,系统也是允许的

其实里氏转换很容易,把它理解为父子关系可以轻松的帮我们梳理通,其实生活和计算机是密不可分的,当我们理解不了一句代码或者是一段代码,完全可以联想生活中的例子来帮助我们,这样不仅有助于我们理解,而且还让我们使用的得心应手!这下看完我博客的同学们,都应该明白什么是里氏转换了吧!如果有什么地方不明白,可以在下方的评论处写明!

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值