当前位置:  技术问答>java相关

如何写抽象类和接口?

    来源: 互联网  发布时间:2015-02-01

    本文导语:  使用抽象类和接口的好处相信大家都比较明白,可是如何写一个好的抽象类和接口出来?怎样提取这样的一个类呢?原则是什么?提取的方法又是什么?或者诸位大虾有什么心得体会? | 比如说下面这个...

使用抽象类和接口的好处相信大家都比较明白,可是如何写一个好的抽象类和接口出来?怎样提取这样的一个类呢?原则是什么?提取的方法又是什么?或者诸位大虾有什么心得体会?

|
比如说下面这个对数据操作的例子,里面定义了几个抽象出来的公用的方法,比如说打开数据库,关闭数据库,得到连接等,当然如果有必要的话,我们还可以‘使用’现在没有实现的方法来完成一些公用的操作,尽管我们不知道具体的实现细节,比如 openDB,我们把 openDB 定义成抽象的原因是为了防止它被错误的实例化,因为它本身是不完整的。
我们在以后可以通过继承它来得到 SQLServerDBAdaper, AccessDBAdaper 等等子类,在子类里可以不用再把这些方法再重写一遍:
这样的继承结构,我认为是易于维护和清晰易懂的。
当然偶的水平有限,也许这个例子做得不好,*^_^* 
想听听其它人的意见。

import java.sql.*;

public abstract class DBAdaper
{
    protected Connection conn = null;

    public abstract void openDB() throws Exception;

    public boolean closeDB(){
        boolean rtn = false;
        try{
            if (conn != null && !conn.isClosed()){
                conn.close();
            }
            conn = null;
            rtn = true;
        } catch(Exception ex) {
        }
        
        return rtn;
    }

    public static Connection getDBConnection(String url) throws Exception
    {
        Connection connection = null;

     String dirverName = "sun.jdbc.odbc.JdbcOdbcDriver";
     Class.forName (dirverName);
        connection = DriverManager.getConnection (url);

        return connection;        
    }    
}

|
这又一篇文章讲代码重用的,其中也提了一部分继承的问题!
我认为不错!
如下:

李炜 
北京杰合伟业软件公司产品技术部经理
2001 年 7 月



代码复用是绝大多数程序员所期望的,也是OO的目标之一。总结我多年的编码经验,为了使代码能够最大程度上复用,应该特别注意以下几个方面。

1、 对接口编程
"对接口编程"是面向对象设计(OOD)的第一个基本原则。它的含义是:使用接口和同类型的组件通讯,即,对于所有完成相同功能的组件,应该抽象出一个接口,它们都实现该接口。具体到JAVA中,可以是接口(interface),或者是抽象类(abstract class),所有完成相同功能的组件都实现该接口,或者从该抽象类继承。我们的客户代码只应该和该接口通讯,这样,当我们需要用其它组件完成任务时,只需要替换该接口的实现,而我们代码的其它部分不需要改变!


当现有的组件不能满足要求时,我们可以创建新的组件,实现该接口,或者,直接对现有的组件进行扩展,由子类去完成扩展的功能。


2、 优先使用对象组合,而不是类继承
"优先使用对象组合,而不是类继承"是面向对象设计的第二个原则。并不是说继承不重要,而是因为每个学习OOP的人都知道OO的基本特性之一就是继承,以至于继承已经被滥用了,而对象组合技术往往被忽视了。下面分析继承和组合的优缺点:


类继承允许你根据其他类的实现来定义一个类的实现。这种通过生成子类的复用通常被称为白箱复用(white-box reuse)。术语"白箱"是相对可视性而言:在继承方式中,父类的内部细节对子类可见。


对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组合对象来获得。对象组合要求对象具有良好定义的接口。这种复用风格被称为黑箱复用(black-box reuse),因为被组合的对象的内部细节是不可见的。对象只以"黑箱"的形式出现。


继承和组合各有优缺点。类继承是在编译时刻静态定义的,且可直接使用,类继承可以较方便地改变父类的实现。但是类继承也有一些不足之处。首先,因为继承在编译时刻就定义了,所以无法在运行时刻改变从父类继承的实现。更糟的是,父类通常至少定义了子类的部分行为,父类的任何改变都可能影响子类的行为。如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。


对象组合是通过获得对其他对象的引用而在运行时刻动态定义的。由于组合要求对象具有良好定义的接口,而且,对象只能通过接口访问,所以我们并不破坏封装性;只要类型一致,运行时刻还可以用一个对象来替代另一个对象;更进一步,因为对象的实现是基于接口写的,所以实现上存在较少的依赖关系。


优先使用对象组合有助于你保持每个类被封装,并且只集中完成单个任务。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物(这正是滥用继承的后果)。另一方面,基于对象组合的设计会有更多的对象(但只有较少的类),且系统的行为将依赖于对象间的关系而不是被定义在某个类中。


注意:理想情况下,我们不用为获得复用而去创建新的组件,只需要使用对象组合技术,通过组装已有的组件就能获得需要的功能。但是事实很少如此,因为可用的组件集合并不丰富。使用继承的复用使得创建新的组件要比组装已有的组件来得容易。这样,继承和对象组合常一起使用。然而,正如前面所说,千万不要滥用继承而忽视了对象组合技术。



|
有很多时候,使用接口只是为了提供一给用户调用的使用界面,也就是和用户的‘接口’。
所以接口这个关键字是很形象的。
比如说你天天都有可能使用的 java.sql.Connection, java.sql.Statement, 等。。。其实都是一些接口而已,里面没有定义任何实现的细节,而具体的实现,对于我们来讲是透明的。

为了达到代码的最大可重用性和结构性,在定义接口时,一方面我们要尽最大可能抽象出所要描述对象的功能交集,但另一方面,我们要最大可能不要包含不应该包含的只适应特定对象的功能。这需要非常细致的需求分析工作。

其实我们有时间的话可以好好分析 JDK 的层次结构,可以学到很多东西。

|
http://www.csdn.net/develop/read_article.asp?id=10461

|
jdk 的整个包的架构就是最好的代码重用的例子。

|
to dbluerabbit(dbluerabbit):
是,所以为了使用方便!
java中很多接口和抽象类是成对儿出现的!
WindowAdapter, WindowListener
MouseAdapter,MouseListener

|
Core Java2上讲得很透彻!

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.script接口invocable的类成员方法: getinterface定义及介绍
  • 关于LOCAL接口和REMOTE接口的同时兼顾的问题
  • java命名空间javax.lang.model.element接口typeelement的类成员方法: getinterfaces定义及介绍
  • 请问 linux 是如何调用 alsa的控制接口的??是通过控制接口名字吗?
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getmanagementspecversion定义及介绍
  • LINUX下最大支持虚接口数是多少? 如果我想配置1000个虚接口可以吗?
  • java命名空间java.beans.beancontext接口beancontextproxy的类成员方法: getbeancontextproxy定义及介绍
  • 对于操作系统的程序接口,作业接口,单内核,微内核到底有什么区别?
  • java命名空间javax.print接口uriexception的类成员方法: getreason定义及介绍
  • java的API中有没有既实现了Map接口又实现了List接口的类?
  • java命名空间javax.swing.text接口caret的类成员方法: install定义及介绍
  • 菜鸟提问:一个类实现了一个接口,除了要定义接口的所有方法外,可不可以再添加其他方法?
  • java命名空间javax.swing接口rootpanecontainer的类成员方法: getrootpane定义及介绍
  • 急,请问如何修改网络接口eth为其它名称,如网络接口为abc0, abc1,要修改哪个配置文件?
  • java命名空间javax.swing.text接口highlighter的类成员方法: install定义及介绍
  • 有人在Linux下用过1394接口的设备吗?怎么装载一个1394接口的存储设备呢?
  • java命名空间java.lang.reflect接口parameterizedtype的类成员方法: getrawtype定义及介绍
  • 请问高手:EJB中的远程接口、本地接口、HOME接口的联系与区别是什么?应用时应注意哪些问题?
  • java命名空间javax.management接口descriptorread的类成员方法: getdescriptor定义及介绍
  • C#学习笔记之接口与基于接口的工厂模型
  • java命名空间javax.lang.model.element接口typeparameterelement的类成员方法: getgenericelement定义及介绍
  • 请问为什麽在J2ee中客户端(测试时)用jndi定位enterprise bean的时候,可以把远程接口实例化?接口不是不可以生成对象的吗?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3