一、子类和父类的关系
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 类型转换关键字是对父类的用法!!
运行结果为: