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