多态结合实际问题

本文通过游戏开发中鸭子类的设计案例,介绍了面向对象设计的两大原则:将可能变化的部分独立出来,以及针对接口而非实现编程。通过具体代码展示了如何使用多态解决不同子类共享行为的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上个学期老师就推荐了《Head.First设计模式》这本书,一直没有时间去看。从今天开始,终于有时间来仔细看了……今天看到的有两个设计原则,下面简单理解一下多态在实际问题中的应用。

按照这本书的例子和写作风格,我的笔记也这样记录下来。本书用一个制作鸭子的类进行引入:

公司制作的一个游戏中,定义了一个Duck类。

这天,公司为了升级游戏,决定在展示给客户的时候能让鸭子飞起来。按照OO设计思想,只要将fly()方法加入到Duck类中,其他的鸭子的子类,就都可以进行继承了,很不错的想法!于是,大家就这样做了。事后发现,这简直是个糊涂的决定,因为,如果我们派生出一个橡皮鸭,难道也要在天上飞来飞去吗?!肯定不行。

以上是基本的背景介绍。

一、找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。

也就是说,在设计之前,将可能变化的部分与不需要变化的部分分开来实现,以鸭子这个类为例的话,fly()方法就要分出来。

这个原则涉及到了每个编程过程。

二、针对接口编程,而不是针对实现编程

这一点,从本质上解决了本实例中出现的问题,其中主要涉及到的内容是多态。

首先,我们先看一下下面两个代码的区别:

1、面向实现编程:

Code:
  1. //面向实现编程
  2. Dogd=newDog();
  3. d.bark();

2、面向接口编程:

Code:
  1. //面向接口编程
  2. Animalanimal=newDog();
  3. animal.bark();

同样,这里的例子也是一样:首先,我们肯定已经将鸭子飞的动作与Duck类分开来实现。那么,我们要想为了实现代码的重用,想到了可爱的多态,实现方法如下:

1、定义一个接口,写入鸭子飞的方法:

Code:
  1. publicinterfaceFlyBehavior{
  2. publicvoidfly();
  3. }

2、两种飞的结果,一个是会飞,一个是不会飞,也就用两个类进行相应的实现:

Code:
  1. //会飞的鸭子可以继承这个类
  2. publicclassFlyClassimplementsFlyBehavior{
  3. publicvoidfly(){
  4. System.out.print("Thisclasscanfly!");
  5. }
  6. }
Code:
  1. //不会飞的继承这个类
  2. publicclassNoFlyClassimplementsFlyBehavior{
  3. publicvoidfly(){
  4. System.out.print("Thisclasscannotfly!");
  5. }
  6. }

3、将之前的Duck类加到一起实现上述功能:

Duck.java实现过程:

Code:
  1. publicclassDuck{
  2. FlyBehaviorflybehavior;
  3. publicvoidflyperform(){
  4. flybehavior.fly();
  5. }
  6. //其他属性和方法
  7. }

定义可以飞的,FlyDuck.java实现过程:

Code:
  1. publicclassFlyDuckextendsDuck{
  2. publicFlyDuck(){
  3. flybehavior=newFlyClass();
  4. }
  5. publicstaticvoidmain(Stringargs[]){
  6. FlyDuckflyduck=newFlyDuck();
  7. flyduck.flyperform();
  8. }
  9. }

输出结果为:Thisclasscanfly!

也可以定义不可以飞的NoFlyDuck.java:

Code:
  1. publicclassNoFlyDuckextendsDuck{
  2. publicNoFlyDuck(){
  3. flybehavior=newNoFlyClass();
  4. }
  5. publicstaticvoidmain(Stringargs[]){
  6. NoFlyDucknoflyduck=newNoFlyDuck();
  7. noflyduck.flyperform();
  8. }
  9. }

输出结果:Thisclasscannotfly!

三、总结

利用接口实现了多态,而且,可以根据需要,将实现接口的类进行修改就可以全部改变子类鸭子的动作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值