如何写抽象类和接口?
本文导语: 使用抽象类和接口的好处相信大家都比较明白,可是如何写一个好的抽象类和接口出来?怎样提取这样的一个类呢?原则是什么?提取的方法又是什么?或者诸位大虾有什么心得体会? | 比如说下面这个...
|
我们在以后可以通过继承它来得到 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 的层次结构,可以学到很多东西。
|
|
|
是,所以为了使用方便!
java中很多接口和抽象类是成对儿出现的!
WindowAdapter, WindowListener
MouseAdapter,MouseListener
|
您可能感兴趣的文章:
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。