实际上,多态性意味着引用类实例的变量可以是该实例继承层次结构中的父类型。让我们考虑一个扩展示例: 向上转换
public class Mammal // 父类 哺乳动物
{
public void GrowFur() { } // 方法 生长毛发
}
public class Cat : Mammal // 子类猫 继承父类哺乳动物
{
public void Meow() { } // 方法 喵
}
public class Dog : Mammal // 子类狗 继承父类哺乳动物
{
public void Woof() { } // 方法 叫
}
public class ResureShelter // 公共类
{
public Mammal[] mammals; //哺乳动物类 实例化
public ResureShelter() // 构造函数初始化
{
mammals = new Mammal[2]; // 初始化对象
mammals[0] = new Cat(); // 创建子类对象
mammals[1] = new Dog(); //
//Cat 和 Dog 的实例可以向上转换为 Mammal,因此可以使用哺乳动物数组来存储这两个类的实例。
//可以将Cat 和 Dog的实例视为其父类的实例,但执行此操作时,子类中的功能不可用。
mammals[0].GrowFur(); // 子类对象可以访问父类方法
//mammals[0].Meow();//子类中的功能不可用
}
}
public class Mammal // 父类 哺乳动物
{
public void GrowFur() { } // 方法 生长毛发
}
public class Cat : Mammal // 子类猫 继承父类哺乳动物
{
public void Meow() { } // 方法 喵
}
public class Dog : Mammal // 子类狗 继承父类哺乳动物
{
public void Woof() { } // 方法 叫
}
public class ResureShelter // 公共类
{
public Mammal[] mammals; //哺乳动物类 实例化
public ResureShelter() // 构造函数初始化
{
mammals = new Mammal[2]; // 初始化对象
mammals[0] = new Cat(); // 创建子类对象
mammals[1] = new Dog(); //
//Cat 和 Dog 的实例可以向上转换为 Mammal,因此可以使用哺乳动物数组来存储这两个类的实例。
//可以将Cat 和 Dog的实例视为其父类的实例,但执行此操作时,子类中的功能不可用。
mammals[0].GrowFur(); // 子类对象可以访问父类方法
//mammals[0].Meow();//子类中的功能不可用
//向下强制转换 as关键词 以访问子类功能
//Cat cat = mammals[0] as Cat; //
//cat.GrowFur();// 既可以访问父类 方法
//cat.Meow();// 也可以访问子类方法
两种转换
上面一种转换 as 如果变量可以转换为该类型,则将返回该变量。如果无法转换,则将返回 null。
//Dog dog = (Dog)mammals[1];
//dog.Woof();
//(Dog)如果变量可以转换为该类型,则将返回该变量。如果无法进行转换,则将引发异常。
//上一步中的示例演示了不正确的强制转换可能会导致错误。避免这种情况的一种方法是使用带有 is 关键字的类型检查表达式 。
//考虑一下 RescueShelter 构造函数的进一步扩展:
if (mammals[0] is Cat) // is 类型检查表达式
{
Cat cat = mammals[0] as Cat;
cat.Meow();
}
if (mammals[1] is Dog)
{
Dog dog = (Dog)mammals[1];
dog.Woof();
}
//此示例中的类型检查表达式is 与使用 as 关键字强制转换的语法类似。如果转换可能,则返回 true,如果转换不可能,则返回 false。
//鉴于此,即使哺乳动物阵列的确切类型未知,此代码也不会导致任何错误。
}
}