一、子類和父類的關系
public class Program{static void Main(string[] args){Animal animal = new Dog();// Dog dog = (Dog)new Animal(); 編譯成功,運行報錯Dog dog = (Dog)animal;Dog dog = new Dog();Animal animal = dog; //等價于Animal animal = new Dog();}}public class Dog:Animal{ }public class Animal{ }
上述代碼中子類是Dog,父類為Animal,子類和父類的關系主要記住為一下三點:
1、子類可以直接轉為父類
Animal animal = new Dog();
2、父類實例化后不能轉為子類,強制轉換后 能編譯但是運行報錯
Dog dog = (Dog)new Animal(); 編譯成功,運行報錯
3、子類可以轉為父類后再轉為其他子類
Animal animal = new Dog();
Dog dog = (Dog)animal;
二、 is和as用法和區別
????????is用于檢查對象是否與指定類型兼容,如果是,則返回true,否則返回false。is操作符不會拋出異常,因此它是一種安全的類型轉換方式。
????????as操作符用于將對象轉換為指定類型,如果對象與指定類型兼容,則返回轉換后的對象,否則返回null。與is操作符不同,as操作符不會拋出異常,因此它也是一種安全的類型轉換方式。
因為只有子類可以轉為父類,所以我們只能去判斷父類是不是子類的實例化類型,只能去判斷animal is dog,animal as dog,不能去判斷子類是否是父類如 dog is animal ,dog as animal!!!
用法示例:
static void Main(string[] args){Animal animal1 = new Dog();if (animal1 as Dog!=null){Console.WriteLine("animal1 is dog");}else{Console.WriteLine("animal1 is not dog");}Animal animal2 = new Animal();if (animal2 as Dog != null){Console.WriteLine("animal2 is dog");}else{Console.WriteLine("animal2 is not dog");}var b1 = animal1 is Dog;var b2 = animal2 is Dog;Console.WriteLine(b1);Console.WriteLine(b2);Console.ReadKey();}}public class Dog:Animal{ }public class Animal{ }
通過將子類dog轉為animal1,則此時父類animal1 是dog類型,由此可以看出父類可以是子類dog類型,也可以是父類animal類型,所以is 和as 類型轉換關鍵字是對父類的用法!!
運行結果為: