.NET基础-10-继承|里氏转换|自动属性|File操作

继承

在编码中会发现有些类中的代码有重复的部分,把这部分重复的部分提取并封装成一个基类,然后让子类继承该基类从而实现代码的重复使用,就是继承,继承解决了代码的冗余

如果一个类继承了另一个类,则该类被称为子类/派生类,被继承的类被称为父类/基类

语法    :被继承的类名称

子类和父类

子类继承了父类的属性和方法

私有字段不能被继承(应为字段都是被private修饰的)

构造函数不能被继承,但是父类的构造函数会被子类调用

子类继承了父类,可以使用父类的属性和方法,也可以具有自己的属性和方法

如果父类里面重构了构造函数,则父类里面默认的无参的构造函数将不再存在,这时候子类会编译出错(因为子类会默认的调用父类无参的构造函数,但是现在父类里面无参的构造函数已经不存在),解决的办法有两个

在子类里面重新创造一个无参的构造函数,让子类可以继续调用无参的构造函数

在子类里面明确需要调用的父类的构造函数,如下示例

在父类创建一个构造函数,如下

        public Person(string name,int age,char gender)
        {
            this.Name = name;
            this.Age = age;
            this.Gender = gender;

        }

在子类中创建构造函数,并且使用[:base()关键字]来显示的调用父类的构造函数

        public Student(string name, int age, char gender, int id)
            : base(name, age, gender)
        {
            this.Id = id;

        }

在创建学生类的是后可以按如下方式

            Student st = new Student("张三", 19, '男', 120);
            Console.WriteLine("我叫{0},我今年{1}岁了,我是{2}生,我的学号是{3}", st.Name, st.Age, st.Gender, st.Id);
            Console.ReadKey();


继承的两个特性

单根性:一个子类只能有一个父类

传递性:子类可以继承父类的属性和方法,而且该子类的属性和方法可以被该子类的子类继承

object是所有类型的父类


自动属性

        public string Name
        {
            get;
            set;

        }

自动属性没有显示的字段,但是会自动为其创建一个对应的隐式的字段

自动属性没法再get与set方法里面写判断信息,如果要对字段内容进行判断只能在构造函数或者在代码汇总书写,这点对于属性来说是不方便的地方


new的作用

创建对象,对类进行实例化

隐藏从父类哪里继承的成员,示例如下

父类中有个方法

public class Person
    {
        public void SayHello()
        {
            Console.WriteLine("你好");
        }

    }

子类继承父类,然后里面有一个相同的方法

    public class Student : Person
    {
        public new void SayHello()
        {
            Console.WriteLine("大家好");
        }
    }

如果在子类中,SayHello()前面没有增加关键字new,会提示Student.SayHell0()隐藏了继承的成员Person.SayHello,如果是有意隐藏请,使用关键字new,加上new,就可以隐藏从父类继承的方法SayHello()


this的作用

代表当前类的对象

显示的调用自己的构造函数

如下面重构了三个构造函数,入参列表都不相同,为了不重新赋值代码,可以直接调用自身的构造函数来赋值

        public Student(string name, int age, char gender, int id)
            : base(name, age, gender)
        {
            this.Id = id;
        }


        public Student(string name, int age, char gender)
            : this(name, age, gender, 0)
        {

        }

        public Student(string name, char gender)
            : this(name, 0, gender, 0)
        {

        }


里氏转换

子类可以赋值给父类

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

            //子类可以赋值给父类
            Student s = new Student();
            Person p = s;

            Person p1 = new Student();

            //如果父类中装的是子类的对象,则可以把这个父类强转为子类对象
            Student s1 = (Student)p1;

如果有一个地方需要传入一个父类,可以使用子类作为作为代替参数传入

在转换之前可以先判断是否可以转换

is:如果转换成功返回true,否则返回false,主要用来判断

            if (p1 is Student)
            {
                Student s1 = (Student)p1;
            }
            else
            {
                Console.WriteLine("转换失败");
            }

as:如果转换成功,则返回转换对的对象,如果转换失败则返回null,主要用来直接转换

           Student s1=p1 as Student;



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值