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

原文地址:https://www.cnblogs.com/CeasarH/p/9202017.html