继承:代码文字结合理解
class Program { static void Main(string[] args) { //Student s = new Student(); //Driver d = new Driver(); Student s = new Student("学生", 18, '男', 101); } } /// <summary> /// 父类——人类 /// </summary> public class Person { 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 void CHLSS() { Console.WriteLine("吃喝拉撒睡"); } public Person(string name, int age, char gender) { this.Name = name; this.Age = age; this.Gender = gender; } public Person() { } } /// <summary> /// 子类——学生 /// </summary> public class Student : Person { public Student(string name, int age, char gender, int id) : base(name, age, gender) { //this.Name = name; //this.Age = age; //this.Gender = gender; this.Id = id; } private int _id; public int Id { get { return _id; } set { _id = value; } } public void Study() { Console.WriteLine("学生会学习"); } } /// <summary> /// 子类——老师 /// </summary> public class Teacher :Person { public Teacher(string name, int age, char gender, double salary) : base(name, age, gender) { this.Salary = salary; } private double _salary; public double Salary { get { return _salary; } set { _salary = value; } } public void Teach() { Console.WriteLine("老师会讲课"); } } /// <summary> /// 子类——司机 /// </summary> public class Driver:Person { public Driver(string name, int age, char gender, int driveTime) : base(name, age, gender) { this.DirveTime = driveTime; } private int _dirveTime; public int DirveTime { get { return _dirveTime; } set { _dirveTime = value; } } public void Drive() { Console.WriteLine("司机会开车"); } }
我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员,
单独的封装到一个类中,作为这些类的父类。
Student、Teacher、Driver 子类 或 派生类
Person 父类 或 基类
问题:子类继承了父类,那么子类从父类那里继承过来了什么?
首先,子类继承了父类的属性和方法,但是子类并没有继承父类的私有字段。
问题:子类有没有继承父类的构造函数?
答:子类并没有继承父类的构造函数,但是。子类会默认的调用父类无参数的构造函数,
创建父类对象,子类可以使用父类中的成员。
所以,如果在父类中重新写了一个有参数的构造函数之后,那个无参数的就被干掉了,
子类就调用不到了,所以子类会报错。
解决办法:
1)、在父类中重新写一个无参数的构造函数。
2)、在子类中显示的调用父类的构造函数,使用关键字:base()
注意:子类对象可以调用父类中的成员,但是父类对象永远都只能调用自己的成员。
里氏转换
1)、子类可以赋值给父类
2)、如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象。
is:表示类型转换,如果能够转换成功,则返回一个true,否则返回一个false
as:表示类型转换,如果能够转换则返回对应的对象,否则返回一个null