继承,里氏转换
继承:
我们可能再写一些类时,会写一些重复的成员,可以将这些成员封装到一个类中,作为这些类的父类
子类没有继承父类的构造函数,但是子类会默认的调用父类无参的构造函数,创建父类对象,让子类可以使用父类中的成员
解决办法:
- 在父类中重新写一个无参数的构造函数
- 在子类中显示的调用父类的构造函数,使用关键字base()
new关键字:
1)创建对象
2)隐藏从父类继承过来的同名成员
隐藏的后果是子类调用不到父类的成员
里氏转换:
1)子类可以赋值给父类
2)如果父类中装的是子类对象,那么可以将这个父类强制转换为子类对象
强制转换格式:
3)Person p=new student();//子类可以赋值给父类 如果父类中装的是子类对象
Student s=(student)p;//将父类对象转换为sudent子类
is:表示类型转换,如果能够转换成功,返回True,否则返回false
If(p 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 }