C#_基础_继承以及关键字new(二十一)
基类的:
把这几个类中重复的内容提取出父类,重复的成员(字段,方法),我们可以抽取重复的成员,单独的封装到这个类中,这些类继承这个父类,这个类就是父类也叫这几个类基类,这些类称为派生类(子类)。
子类可以从父类中继承什么?
1 public class Person 2 { 3 4 public Person() 5 { 6 Console.WriteLine("子类会默认调用父类的无参构造函数,初始化数据"); 7 } 8 9 public Person(string name, int age, char gender) 10 { 11 this.Name = name; 12 this.Age = age; 13 this.Gender = gender; 14 15 } 16 17 18 ~Person() 19 { 20 Console.WriteLine("父类析构函数"); 21 } 22 23 24 private string _name; 25 public string Name 26 { 27 get { return _name; } 28 set 29 { 30 _name = value; 31 } 32 } 33 34 35 36 private int _age; 37 38 public int Age 39 { 40 get { return _age; } 41 set { _age = value; } 42 } 43 44 private char _gender; 45 46 public char Gender 47 { 48 get { return _gender; } 49 set { _gender = value; } 50 } 51 52 53 54 public void Eat() 55 { 56 Console.WriteLine("Person Eat"); 57 } 58 59 60 } 61 62 63 64 public class Student:Person 65 { 66 public Student() 67 { 68 Console.WriteLine("Student"); 69 } 70 ~Student() 71 { 72 Console.WriteLine("子类析构函数"); 73 } 74 75 76 77 private int _id; 78 79 public int ID 80 { 81 get { return _id; } 82 set { _id = value; } 83 } 84 }
1 static void Main(string[] args) 2 { 3 //1.测试继承 子类对象都可以获取到父类的public protected修饰的属性和方法,不能获取到private修饰的字段 4 Student s = new Student(); 5 s.Age = 10; 6 int age = s.Age; 7 8 s.Eat(); 9 10 Console.ReadKey(); 11 12 }
结论:子类从父类中继承了public,protected 修饰的成员,不能继承private修饰的成员
子类有没有继承父类的构造函数?
不会继承父类构造函数。
通过端点方法,F11查看创建创建对象的过程。
Student s = new Student(); 先执行父类构造函数,执行父类构造函数,给父类在堆中创建父类对象,
子类会默认调用父类的无参数构造函数,初始化数据,所以父类一定要有无参数构造函数。
注意:默认会有无参数构造函数,如果有无参数构造函数,就没有无参数构造函数,如果父类中没有无参数构造函数怎么解决?
1.给父类中手写一个无参数构造(子类创建对象默认调用)
2. 通常会用base()关键字显式调用父类的有参数构造方法
1 public class Person 2 { 3 4 public Person() 5 { 6 Console.WriteLine("子类会默认调用父类的无参构造函数,初始化数据"); 7 } 8 9 public Person(string name, int age, char gender) 10 { 11 this.Name = name; 12 this.Age = age; 13 this.Gender = gender; 14 15 } 16 } 17 18 public Student(string name,int age, char gender, int id): 19 base(name,age,gender) //调用父类的有参数构造 20 { 21 this.ID = id; //子类中特有的属性 22 23 }
Tip: 可以通过右键类脚本,查看类图,查看各个类之间的关系。
继承的特点:
1.单继承,也叫单根性。就是只能继承一个父类
2.传递性。可以连续继承
Student类 继承 Man类, Man类继承 Person类这样可以一直继承下去。
那么子类Student类中就同时有了Man,Person中继承到的protected,public修饰的成员
如果子类中有父类中相同的方法怎么解决,怎么调用?
子类有和父类同名的成员,子类对象调用,优先调用子类自己的成员。
1 class People 2 { 3 public void Run() 4 { 5 Console.WriteLine("父类"); 6 } 7 } 8 9 class Doctor:People 10 { 11 12 public void Run() 13 { 14 Console.WriteLine("子类"); 15 } 16 17 18 19 } 20 class Progress 21 { 22 static void Main() 23 { 24 Doctor doc = new Doctor(); 25 doc.Run(); //输出结果 子类 26 Console.ReadKey(); 27 } 28 }
子类中有和父类中有相同的属性方法,会出现这个提示:.
加上new就可以了:那么new的作用是什么呢?
关键字 new 做修饰符:作用:隐藏从父类继承过来的同名的成员 ,隐藏的结果就是子类调用不到父类对应的成员。
使用: 如果子类成员中有和父类相同的成员,会提示警告,子类隐藏了父类的成员,需要加上关键字new