C#类的继承,方法的重载和覆写
在网易云课堂上看到唐大仕老师讲解的关于类的继承、方法的重载和覆写的一段代码,注释比较详细,在此记下以加深理解。
小总结:
1、类的继承:允许的实例化方式:Student t=new Student(),Person p=new Person(),Person p2=t,具有学生属性的人类可以强制转换为学生类:Student t2=(Student)p2,但不可以Student t3=(Student)p;
2、方法的重载:基类方法重载只要求方法名称相同,返回类型、参数数目和参数类型都可以不相同;
3、方法的覆写:只有基类中有virtural修饰的方法才可以在子类中覆写,覆写不能改变基类方法的参数数目、参数类型和返回类型,只能覆写方法的具体实现。如果子类覆写了一个基类的方法,那么子类的实例在调用该方法时实际上调用的是被子类覆写后的方法。如果在基类中该方法有重载的其他方法,那么子类的实例在调用该方法名称时VS会提示有重载方法,此时可以根据函数的返回类型、参数数目和参数类型来确定具体调用的是基类还是子类的方法。简单的说,子类覆写基类的方法后,子类的实例调用该方法时调用的是子类的方法;
1 using System; 2 public class Person { 3 public string name; //定义域 4 public int age; 5 virtual public void SayHello(){ //定义方法 //virtual表示可以被子类override 6 Console.WriteLine("Hello! My name is " + name ); 7 } 8 public void SayHello( Person another ){ //构造方法重载同名的sayHello方法 9 Console.WriteLine("Hello," + another.name + 10 "! My name is " + name ); 11 } 12 public bool IsOlderThan( int anAge ){ //定义方法 13 bool flg; 14 if( age > anAge ) flg = true; else flg=false; 15 return flg; 16 } 17 public Person( string n, int a ){ //构造方法 18 name = n; 19 age = a; 20 } 21 public Person( string n ){ //构造方法重载 22 name = n; 23 age = -1; 24 } 25 public Person( ):this( "", 0 )//调用其他构造方法 26 { 27 } 28 } 29 30 public class Student : Person //定义子类 31 { 32 public string school; //增加的字段 33 public int score = 0; 34 public bool isGoodStudent(){ //增加的方法 35 return score>=90; 36 } 37 override public void SayHello(){ //override覆盖父类的方法 38 base.sayHello(); 39 Console.WriteLine( "My school is " + school ); 40 } 41 public void SayHello( Student another ){ //增加的方法 42 Console.WriteLine("Hi!"); 43 if( school == another.school ) 44 Console.WriteLine(" Shoolmates "); 45 } 46 47 public Student(){ //构造方法 48 } 49 public Student(string name, int age, string school ) 50 : base( name, age ) //调用父类的构造方法 51 { 52 this.school = school; 53 } 54 55 public void TestThisSuper(){ 56 int a; 57 a = age; //本句与以下两句效果相同 58 a = this.age; //使用this 59 a = base.age; //使用base 60 } 61 62 63 public static void Main( string [] arggs ) 64 { 65 Person p = new Person( "Liming", 50 ); 66 Student s = new Student( "Wangqiang", 20, "PKU" ); 67 Person p2 = new Student( "Zhangyi", 18, "THU" ); 68 Student s2 = (Student) p2; //类型转换 69 } 70 }
*********************************************************************************
另外,提一下之前我在KD的面试题,关于类的继承、转换和方法调用:
假设有两个类,基类和子类:
1 class Person 2 { 3 public virtual string MethordA() 4 { 5 return "Person MethordA()"; 6 } 7 } 8 class Student:Person 9 { 10 public override string MethordA() 11 { 12 return "Student MethordA()"; 13 } 14 }
那么如下的方法会输出什么结果?
1 Person p = new Person(); 2 Console.WriteLine("Person p = new Person();p.MethordA()--{0}", p.MethordA()); 3 Student t = new Student(); 4 Console.WriteLine("Student t = new Student();t.MethordA()--{0}", t.MethordA()); 5 6 Person p2 = t; 7 Console.WriteLine("Person p2 = t;p2.MthordA()--{0}", p2.MethordA()); 8 Student t2 = (Student)p2; 9 Console.WriteLine("Student t2 =(Student)p2;t2.MethordA()--{0}", t2.MethordA()); 10 11 Student t3 =(Student)p; 12 Console.WriteLine("Student t2 =(Student)p;t2.MethordA()--{0}", t3.MethordA());
结果如下:
其中第11行代码会报错,不能将Person类型的p强制转换为Student。