项目管理 | IT/商务管理 | 职涯
首页 - 管理和职涯
管理&职涯
全文搜索:   

OOP: 继承以及多态
作者:
2001-10-10 20:05:09



在"OOP简介:理解类和对象"这篇文章中,我们讨论了继承和多态性的好处.我们还粗略的学习了如何扩展基类定义子类,继承基类中合适的行为和属性而重载那些并不适合的行为和属性.这种方式能够削减代码宏余以及错误的堆积.

现在我们将更深入的考察多重继承性以及Java是如何处理它的.我们还将通过学习动态绑定来学习多态性.

深入继承性
一些面向对象的语言提供叫做"多重继承"的特点,当一个对象需要从多于一个的基类继承行为和属性的时候这是有价值的.多重继承在有些情况下是复杂的.例如,假设我们需要定义一个基类,Animal,然后是Animal的两个子类,LandAnimal 和 WaterAnimal.现在我们想要定义一个类来代表青蛙.青蛙是两栖动物,所以我们自然会想到定义Frog类从LandAnimal和WaterAnimal类继承.这使得Frog类能够同时从LandAnimal 和WaterAnimal类继承所需的行为和属性.

初看起来这是相当简单的;但是,让我们为Animal添加一个叫做LivingEnvironment的属性,并用方法getLivingEnvironment来返回它.我们假设LandAnimal 和 WaterAnimal类都重载了这个方法来实现特殊的功能.LandAnimal将返回Land作为它的LivingEnvironment属性的值,而WaterAnimal将返回Water作为它的LivingEnvironment属性的值.现在,当我们将Frog类作为LandAnimal 和 WaterAnimal 子类实现的时候,想要得到Frog的LivingEnvironment属性值,这时将遇到一个麻烦:Frog类的getLivingEnvironment方法是返回Land值呢还是Water值?答案取决于编译器如何处理多重继承.

我在前面的文章里就已经说过,Java不支持多重继承.但它确实允许一个对象通过使用叫做"接口"的功能拥有多个特性.下面的例子显示了定义LandAnimal的接口的可能的定义代码:
public interface LandAnimal
{
    public int getNumberOfLegs();
    public boolean hasATail();
}


一个使用接口的类在类定义语句的开始添加implements+接口名.例如,在Java中,我们会以下面的方式定义Frog类:


public class Frog extends Animal implements LandAnimal, WaterAnimal

接口并没有什么实际的功能;相反,它的作用是联系使用者和实现了这个接口的对象.接口保证了对象实现接口定义的方法.而且,一个实现接口的对象能够在运行时被强制转换成接口类型.例如,使用上面的Frog定义,并且假设LandAnimal类定义了一个叫做getNumberOfLegs的方法而WaterAnimal定义了一个叫做hasGills的方法,那么一个Frog类的实例可以在运行时被强制转换成LandAnimal或WaterAnimal对象:


Frog aFrog = new Frog();
int legCount = ((LandAnimal)aFrog).getNumberOfLegs();
Boolean gillFlag = ((WaterAnimal)aFrog).hasGills();



注意Forg为什么能够被强制转换成一个LandAnimal对象即使实际的LandAnimal对象并没有被创建.这使得我们能够在运行时以其带有的任何"身份"调用一个对象,这就是所谓的"动态绑定"或"运行时绑定".

【下一页】
声明:
Builder.com.cn(原ZDNet China应用开发频道)原创文章版权所有,未经许可严禁转载,且不构成投资建议。
近期相关报道:
实用技术文档
J2me XML
C/C++ C#
Java Oracle
Mysql .Net
VB.NET CSS
SQL Server 数据库
SQL UNIX
Linux Jsp
PHP Perl
Javascript IIS
XHTML ColdFusion
ASP/ASP.NET Apache
AJAX
订阅技术邮件
订阅"技术圈"杂志!请在下面选择您感兴趣的专题,填写e-mail地址,然后按订阅按钮:
应用开发管理
VS.NET 周刊
Database 周刊
WEB Service周刊
JAVA 周刊
IT 认证
Windows服务器周刊
互联网开发
当Windows Server 2008专家得5000元现金大奖
Copyright (c) CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
ZDNet 公司标识是 CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159