多态性的实际应用

实际上,多态性意味着引用类实例的变量可以是该实例继承层次结构中的父类型。让我们考虑一个扩展示例: 向上转换

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。
        //鉴于此,即使哺乳动物阵列的确切类型未知,此代码也不会导致任何错误。
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值