父类引用指向子类对象,除游戏场景外还有哪些实用应用场景?
先看示例代码:
Dog rover = new Puppy("rover"); // Where Puppy extends Dog
除了你提到的游戏进程中切换对象类型的场景,父类引用指向子类对象还有这些非常实用的场景:
统一处理不同子类实例
假设有Dog的多个子类:Puppy、GuardDog、GuideDog,每个子类都有自己的实现,但如果要写一个让所有狗“叫一声”的方法,用父类Dog作为参数类型就能统一处理:public void makeDogBark(Dog dog) { dog.bark(); }不管传入的是
Puppy还是GuardDog,这个方法都能直接调用,不用为每个子类单独写方法。后续新增Dog子类时,也不用修改这个方法,完全符合开闭原则。实现多态核心逻辑
多态的核心就是父类引用指向子类对象,调用方法时会自动执行子类的重写实现。比如Dog类定义了bark()方法,Puppy重写它发出奶声奶气的叫声,GuardDog重写它发出洪亮的警告声。当你用Dog dog = new Puppy();调用dog.bark()时,实际执行的是Puppy的bark方法——不用修改父类代码,就能让不同子类表现出不同行为,让程序更灵活。简化集合操作
如果要存储各种Dog子类的对象,用父类类型的集合会更便捷:List<Dog> dogList = new ArrayList<>(); dogList.add(new Puppy("rover")); dogList.add(new GuardDog("max")); dogList.add(new GuideDog("lucky"));遍历集合时,直接用
Dog类型处理即可,不用关心每个元素具体是哪个子类,操作更统一。降低代码耦合(依赖倒置)
程序设计中,高层模块应该依赖抽象(父类/接口)而非具体实现。比如宠物管理系统的管理模块,不用关心具体是Puppy还是GuardDog,只需要依赖Dog这个抽象类型。后续如果要替换成新的Dog子类,管理模块的代码完全不用修改,耦合度大幅降低,维护更轻松。适配已有接口
假设你有一个现成方法,参数要求是Dog类型,但你手上只有Puppy对象,直接用Dog dog = new Puppy();就能把Puppy对象传入这个方法,不用修改原有方法的参数类型,也不用重新实现方法,完美适配现有接口。
内容的提问来源于stack exchange,提问作者DCR

