在網易雲課堂上看到唐大仕老師講解的關於類的繼承、方法的重載和覆寫的一段代碼,注釋比較詳細,在此記下以加深理解。
小總結:
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。