继承,里氏转换


继承:

我们可能再写一些类时,会写一些重复的成员,可以将这些成员封装到一个类中,作为这些类的父类

子类没有继承父类的构造函数,但是子类会默认的调用父类无参的构造函数,创建父类对象,让子类可以使用父类中的成员

解决办法:

  1. 在父类中重新写一个无参数的构造函数
  2. 在子类中显示的调用父类的构造函数,使用关键字base()

 

new关键字:

1)创建对象

2)隐藏从父类继承过来的同名成员

隐藏的后果是子类调用不到父类的成员

 

里氏转换:

1)子类可以赋值给父类

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

强制转换格式:

3)Person p=new student();//子类可以赋值给父类 如果父类中装的是子类对象

Student s=(student)p;//将父类对象转换为sudent子类

is:表示类型转换,如果能够转换成功,返回True,否则返回false

Ifp is Student

Student s=(Student)p;

S.调用

}

else

as:表示类型转换,如果能够转换则返回对应的对象,否则返回一个null

Student s=p as Student;

1.继承练习

  1 using System;
  2 
  3 namespace Practice_继承
  4 {
  5     class Program
  6     {
  7         static void Main(string[] args)
  8         {
  9             Driver s = new Driver("张娜",10,'',5);
 10             s.CHLSS();
 11             s.Drive();
 12             Teacher t = new Teacher("王五", 55, '', 5000);
 13             t.teach();
 14             Student u = new Student("小亮",18, '', 0322211038);
 15             u.Study();
 16             Console.ReadKey();
 17         }
 18     }
 19 }
 20 
 21 
 22 
 23 using System;
 24 using System.Collections.Generic;
 25 using System.Linq;
 26 using System.Text;
 27 using System.Threading.Tasks;
 28 
 29 namespace Practice_继承
 30 {
 31     public class Person
 32     {
 33         private string _name;
 34         public string Name
 35         {
 36             get { return _name; }
 37             set { _name = value; }
 38         }
 39         private int _age;
 40         public int Age
 41         {
 42             get { return _age; }
 43             set { _age = value; }
 44         }
 45         private char _gender;
 46         public char Gender
 47         {
 48             get { return _gender; }
 49             set { _gender = value; }
 50         }
 51         public void CHLSS()
 52         {
 53             Console.WriteLine("HAO");
 54         }
 55         public Person(string name,int age,char gender)
 56         {
 57             this.Name = name;
 58             this.Age = age;
 59             this.Gender = gender;
 60         }
 61         
 62     }
 63 }
 64 
 65 
 66 
 67 
 68 using System;
 69 using System.Collections.Generic;
 70 using System.Linq;
 71 using System.Text;
 72 using System.Threading.Tasks;
 73 
 74 namespace Practice_继承
 75 {
 76     public class Teacher:Person
 77     {
 78         
 79         private int _salary;
 80         public int Salary
 81         {
 82             get { return _salary; }
 83             set {_salary = value; }
 84         }
 85        
 86 
 87         public void Teach()
 88         {
 89             
 90         }
 91         public Teacher(string name,int age,char gender,int salary) : base(name, age, gender)
 92         {
 93             this.Salary = salary;
 94         }
 95         public void teach()
 96         {
 97             Console.WriteLine("我叫{0},{1},{2},工资{3}", this.Name, this.Age, this.Gender,this.Salary); ·
 98         }
 99     }
100 }
101 
102 
103 
104 
105 using System;
106 using System.Collections.Generic;
107 using System.Linq;
108 using System.Text;
109 using System.Threading.Tasks;
110 
111 namespace Practice_继承
112 {
113     public class Student:Person
114     {
115        
116         private int _id;
117         public int Id
118         {
119             get { return _id; }
120             set { _id = value; }
121         }
122        
123         public void Study()
124         {
125             Console.WriteLine("我叫{0},{1},{2},学号{3}", this.Name, this.Age, this.Gender, this.Id);
126         }
127         public Student(string name, int age, char gender, int id) : base(name, age, gender)
128         {
129             this.Id =id;
130         }
131     }
132 }
133 
134 
135 
136 
137 using System;
138 using System.Collections.Generic;
139 using System.Linq;
140 using System.Text;
141 using System.Threading.Tasks;
142 
143 namespace Practice_继承
144 {
145     public class Driver:Person
146     {
147        public Driver(string name,int age,char gender,int drivertime)
148             :base(name,age,gender)
149         {
150             this.DriverTime=drivertime;
151         }
152         private int _drivertime;
153         public int DriverTime
154         {
155             get { return _drivertime; }
156             set {_drivertime = value; }
157         }
158        
159         public void Drive()
160         {
161             Console.WriteLine("我叫{0},{1},{2},", this.Name,this.Age , this.Gender);
162         }
163     }
164 }

2.继承练习

  1 using System;
  2 
  3 namespace Practice_继承1
  4 {
  5     class Program
  6     {
  7         static void Main(string[] args)
  8         {
  9             Reporter r = new Reporter("李华", 18, "篮球");
 10             r.sayHello();
 11             Programmer p = new Programmer("小撒", 18, 5);
 12             p.sayHello();
 13             Console.ReadKey();
 14         }
 15     }
 16 }
 17 
 18 
 19 
 20 using System;
 21 using System.Collections.Generic;
 22 using System.Linq;
 23 using System.Text;
 24 using System.Threading.Tasks;
 25 
 26 namespace Practice_继承1
 27 {
 28     public class Person
 29     {
 30         private string _name;
 31         public string Name
 32         {
 33             get { return _name; }
 34             set { _name = value; }
 35         }
 36         private int _age;
 37         public int Age
 38         {
 39             get { return _age; }
 40             set { _age = value; }
 41         }
 42         public Person(string name,int age)
 43         {
 44             this.Name = name;
 45             this.Age = _age;
 46         }
 47     }
 48 }
 49 
 50 
 51 
 52 using System;
 53 using System.Collections.Generic;
 54 using System.Linq;
 55 using System.Text;
 56 using System.Threading.Tasks;
 57 
 58 namespace Practice_继承1
 59 {
 60     public class Programmer : Person
 61     {
 62         
 63         private int _worktime;
 64         public int Worktime
 65         {
 66             get { return _worktime; }
 67             set { _worktime = value; }
 68         }
 69         public Programmer(string name, int age, int worktime) : base(name, age)
 70         {
 71             this.Worktime = worktime;
 72         }
 73         public void sayHello()
 74         {
 75             Console.WriteLine("大家好,我叫{0},我今年{1}岁,工作{2}年", this.Name, this.Age, this.Worktime);
 76         }
 77        
 78     }
 79 }
 80 
 81 
 82 
 83 using System;
 84 using System.Collections.Generic;
 85 using System.Linq;
 86 using System.Text;
 87 using System.Threading.Tasks;
 88 
 89 namespace Practice_继承1
 90 {
 91     public class Reporter : Person
 92     {
 93         
 94         private string _like;
 95         public string Like
 96         {
 97             get { return _like; }
 98             set { _like = value; }
 99         }
100         
101         public void sayHello()
102         {
103             Console.WriteLine("大家好,我叫{0},我今年{1}岁,爱好{2}", this.Name, this.Age, this.Like);
104         }
105         public Reporter(string name, int age,string like) : base(name, age)
106         {
107             this.Like = like;
108         }
109 
110 
111     }
112 }

3.里氏转换

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace _02里氏转换
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             ////           1、里氏转换
14             ////1)、子类可以赋值给父类:如果有一个地方需要一个父类作为参数,我们可以给一个子类代替
15             //  Student s = new Student();
16             Person p = new Student();//s;
17 
18             //string str = string.Join("|",new string[] { "1", "2", "3", "4" });
19             //Console.WriteLine(str);
20             //Console.ReadKey();
21 
22             ////2)、如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象。
23 
24             //is的用法
25             //if (p is Student)
26             //{
27             //    Student ss = (Student)p;
28             //    ss.StudentSayHello();
29             //}
30             //else
31             //{
32             //    Console.WriteLine("转换失败");
33             //}
34 
35             //as的用法
36 
37             Teacher t = p as Teacher;
38             t.TeacherSayHello();
39             Console.ReadKey();
40 
41 
42         }
43     }
44 
45     public class Person
46     {
47         public void PersonSayHello()
48         {
49             Console.WriteLine("我是父类");
50         }
51     }
52     public class Student : Person
53     {
54         public void StudentSayHello()
55         {
56             Console.WriteLine("我是学生");
57         }
58     }
59     public class Teacher : Person
60     {
61         public void TeacherSayHello()
62         {
63             Console.WriteLine("我是老师");
64         }
65     }
66 
67 
68 }

4.里氏转换练习

  1 using System;
  2 
  3 namespace Practice_里氏转换
  4 {
  5     class Program
  6     {
  7         static void Main(string[] args)
  8         {
  9             Person[] per= new Person[10];
 10             Random r = new Random();
 11             for (int i = 0; i < per.Length; i++)
 12             {
 13                 int rNumber = r.Next(1, 7);
 14                 switch (rNumber)//创建类对象并传入person类数组 相当于父类中装入子类对象
 15                 {
 16                     case 1:per[i] = new Student();
 17                         break;
 18                     case 2:per[i] = new Person();
 19                         break;
 20                     case 3:per[i] = new Yeshou();
 21                         break;
 22                     case 4:per[i] = new Shuaige();
 23                         break;
 24                     case 5:per[i] = new Teacher();
 25                         break;
 26                     case 6:per[i] = new Meinv();
 27                         break;
 28                 }
 29             }
 30             for (int i = 0; i < per.Length; i++)//强制转换
 31             {
 32                 if(per[i] is Student)
 33                 {
 34                     Student s=(Student)per[i];
 35                     s.StudentSayHello();
 36                 }
 37                 else if(per[i] is Meinv)
 38                 {
 39                     ((Meinv)per[i]).MeinvSayHello();
 40                 }
 41                 else if(per[i] is Teacher)
 42                 {
 43                     ((Teacher)per[i]).TeacherSayHello();
 44                 }
 45                 else if(per[i] is Shuaige)
 46                 {
 47                     ((Shuaige)per[i]).ShuaigeSayHello();
 48                 }
 49                 else if(per[i] is Yeshou)
 50                 {
 51                     ((Yeshou)per[i]).YeshouSayHello();
 52                 }
 53                 else
 54                 {
 55                     per[i].PersonSayHello();
 56                 }
 57             }
 58 
 59         }
 60     }
 61 }
 62 
 63 
 64 
 65 using System;
 66 using System.Collections.Generic;
 67 using System.Linq;
 68 using System.Text;
 69 using System.Threading.Tasks;
 70 
 71 namespace Practice_里氏转换
 72 {
 73     public class Person
 74     {
 75         public void PersonSayHello()
 76         {
 77             Console.WriteLine("我是人类");
 78         }
 79     }
 80 }
 81 
 82 
 83 using System;
 84 using System.Collections.Generic;
 85 using System.Linq;
 86 using System.Text;
 87 using System.Threading.Tasks;
 88 
 89 namespace Practice_里氏转换
 90 {
 91     public class Student:Person
 92     {
 93         public void StudentSayHello()
 94         {
 95             Console.WriteLine("我是学生");
 96         }
 97     }
 98 }
 99 
100 
101 
102 
103 using System;
104 using System.Collections.Generic;
105 using System.Linq;
106 using System.Text;
107 using System.Threading.Tasks;
108 
109 namespace Practice_里氏转换
110 {
111     public class Teacher : Person
112     {
113         public void TeacherSayHello()
114         {
115             Console.WriteLine("我是老师");
116         }
117     }
118 }
119 
120 
121 
122 
123 using System;
124 using System.Collections.Generic;
125 using System.Linq;
126 using System.Text;
127 using System.Threading.Tasks;
128 
129 namespace Practice_里氏转换
130 {
131     public class Shuaige : Person
132     {
133         public void ShuaigeSayHello()
134         {
135             Console.WriteLine("我是帅哥");
136         }
137      }
138 }
139 
140 
141 
142 
143 using System;
144 using System.Collections.Generic;
145 using System.Linq;
146 using System.Text;
147 using System.Threading.Tasks;
148 
149 namespace Practice_里氏转换
150 {
151     public class Yeshou : Person
152     {
153         public void YeshouSayHello()
154         {
155             Console.WriteLine("我是野兽");
156         }
157     }
158 }
159 
160 
161 
162 
163 using System;
164 using System.Collections.Generic;
165 using System.Linq;
166 using System.Text;
167 using System.Threading.Tasks;
168 
169 namespace Practice_里氏转换
170 {
171     public class Meinv : Person
172     {
173         public void MeinvSayHello()
174         {
175             Console.WriteLine("我是霉女");
176         }
177     }
178 }