1、定義:指不同的對象收到相同的消息時,會產生不同的行為,同一個類在不同的場合下表現出不同的行為特征。 比如。 多態的作用:把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,作出通用的編程,以適應需求的不斷變化。 2、實現多態。 虛方法實現方法重寫來實現多態。 例子中, ...
1、定義:指不同的對象收到相同的消息時,會產生不同的行為,同一個類在不同的場合下表現出不同的行為特征。
比如。
class Program {
//下麵三各類都繼承object,但不同類的tostring()有不同的表現。 static void Main(string[] args) { object o = new object(); Console.WriteLine(o.ToString()); Person person = new Person(); Console.WriteLine(person.ToString()); string msg = "你好"; Console.WriteLine(msg.ToString()); } } public class Person { public string Name { get; set; } public int Age { get; set; } }
多態的作用:把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,作出通用的編程,以適應需求的不斷變化。
2、實現多態。
虛方法實現方法重寫來實現多態。
class Program { //希望person存的是哪個類的對象就調用哪個類的方法 //第一步 將父類中對應方法家virtual關鍵字 變為虛方法(子類可重寫) //子類中方法用override關鍵字將父類虛方法重寫 static void Main(string[] args) { Person[] person = new Person[3]; person[0] = new American(); person[1] = new Japan(); person[2] = new Chinese(); for (int i = 0; i < person.Length; i++) { //由於person是Person類的,如果我想讓每個人說出他的國籍 //只能判斷類型然後強制轉換: //if (person[0]is American) //{ // ((American)person[0]).Say(); //} //希望person存的是哪個類的對象就調用哪個類的方法 //第一步 將父類中對應方法家virtual關鍵字 變為虛方法(子類可重寫) //子類中方法用override關鍵字將父類虛方法重寫 person[i].Say(); //這句話就體現了多態 } } } public class Person { public string Name { get; set; } public int Age { get; set; } public virtual void Say() { Console.Write("Person"); } } public class American:Person { public override void Say() { Console.WriteLine("美國人"); } } public class Japan:Person { public override void Say() { Console.WriteLine("日本人"); } } public class Chinese : Person { public override void Say() { Console.WriteLine("中國人"); } }
例子中,把所有子類都當作Person類來對待,屏蔽掉了各個子類的不同成員(.點不出來),其中person[i].Say();就是通用的代碼。
通過抽象類實現多態:
抽象類:1、類前加abstract 2、抽象類中可以有實例成員,也可以有實例成員。3、抽象成員不能有實現 4、 抽象成員必須包含在抽象類中。 5、抽象類不能用來實例化對象(作用:被繼承----實現多態) 6、抽象成員子類繼承後必須重寫,除非子類也是抽象類。 (就像領導,只告訴員工要做什麼)
實現:和上面虛方法類似,利用重寫來實現。
抽象類和虛方法選哪個:如果需要實例化或者父類中有預設的實現就選虛方法,否則用抽象類。
例子:
class Program { static void Main(string[] args) { Pc pc = new Pc(); All udisk = new UDisk(); pc.Device = udisk; pc.PCRead(); pc.PCWrite(); } } public abstract class All { public abstract void Read(); public abstract void Write(); } public class Mp3 : All { public override void Read() { Console.WriteLine("Mp3讀"); } public override void Write() { Console.WriteLine("Mp3寫"); } } public class UDisk : All { public override void Read() { Console.WriteLine("udisk read"); } public override void Write() { Console.WriteLine("udisk write"); } } public class Pc { public All Device{ get; set; } public void PCRead() { Device.Read(); } public void PCWrite() { Device.Write(); } }