向上转型(隐式类型转换) - 子类转换成父类
- 向上转型一定成功
Dog dog = new Dog();
Animal animal = dog;
// => Animal animalDog = new Dog();
// => sbyte b = 1; int a = b; => int ab = 1;
class Animal { }
class Dog : Animal { }
class Hashiqi : Dog { }
- 示例:动物园动物录入
class MainClass
{
public static void Main(string[] args)
{
Animal.RecordAnimal(new Bird()); // 录入动物
// => 详单于
// Animal animal = new Bird(); // 向上转型
// Animal.RecordAnimal(animal);
}
}
class Animal {
public static void RecordAnimal(Animal animal) { }
}
class Bird : Animal { }
class Monkey : Animal { }
class Tiger : Animal { }
- 向上转型后的对象将不再能够使用子类中特有的字段属性和方法
class MainClass
{
public static void Main(string[] args)
{
Hashiqi hashiqi = new Hashiqi();
hashiqi.type = ""; // ok
hashiqi.sex = ' '; // ok
hashiqi.name = ""; // ok
hashiqi.age = 1; // ok
Dog dog = new Dog();
//dog.type = ""; // Error “Dog”未包含“type”的定义,并且找不到可接受第一个“Dog”类型参数的可访问扩展方法“type”
dog.sex = ' '; // ok
dog.name = ""; // ok
dog.age = 1; // ok
Animal animal = new Animal();
//animal.type = ""; // Error “Animal”未包含“type”的定义,并且找不到可接受第一个“Animal”类型参数的可访问扩展方法“type”
//animal.sex = ' '; // Error “Animal”未包含“sex”的定义,并且找不到可接受第一个“Animal”类型参数的可访问扩展方法“sex”
animal.name = ""; // ok
animal.age = 1; // ok
Animal d = new Hashiqi();
//d.type = ""; // Error “Animal”未包含“type”的定义,并且找不到可接受第一个“Animal”类型参数的可访问扩展方法“type”
//d.sex = ' '; // Error “Animal”未包含“sex”的定义,并且找不到可接受第一个“Animal”类型参数的可访问扩展方法“sex”
d.name = ""; // ok
d.age = 1; // ok
Dog dd = new Hashiqi();
//dd.type = ""; // Error “Dog”未包含“type”的定义,并且找不到可接受第一个“Dog”类型参数的可访问扩展方法“type”
dd.sex = ' '; // ok
dd.name = ""; // ok
dd.age = 1; // ok
}
}
class Animal {
public string name;
public int age;
}
class Dog : Animal {
public char sex;
}
class Hashiqi : Dog {
public string type;
}
向下转型(需要强制类型转换) - 父类转换成子类
- 如果向下转型失败,那么得到
null
// Dog dog = (Dog)new Animal(); // 不推荐
Dog dog = new Animal() as Dog;
Console.WriteLine(dog == null); // True
class Animal { }
class Dog : Animal { }
class Hashiqi : Dog { }
- 转型成功
class MainClass
{
public static void Main(string[] args)
{
Animal animal = new Dog(); // 向上转型
Dog dog = animal as Dog; // 向下转型
Console.WriteLine(dog); // Dog
Console.WriteLine(dog == null); // False
}
}
class Animal { }
class Dog : Animal { }
class Hashiqi : Dog { }
- 向下转型错误示例
class MainClass
{
public static void Main(string[] args)
{
Hashiqi hashiqi = new Animal() as Hashiqi; // 向下转型
Console.WriteLine(hashiqi == null); // True
Console.WriteLine(hashiqi.type == null); // Error System.NullReferenceException
}
}
class Animal {
public string name;
public int age;
}
class Dog : Animal {
public char sex;
}
class Hashiqi : Dog {
public string type;
}