`
卒子99
  • 浏览: 75442 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

接口,抽象类的使用

阅读更多
   以前在使用接口的时候,就知道它可以抽象系统模型,便于扩展。但到底什么时候使用接口,什么时候使用抽象类,我一直也不是很清楚。但最新做了一个项目,其中遇到抽象一个系统模型的时候,让我明白了他们的用途。废话少说,直接上Case了
  需求:从文件中系统中读取数据,可支持从TXT文件,XML,XLS.....

  这个是最初的需求,很简单,系统支持从多文件格式读取数据,首先抽象出一个AbstractFileDataParser类,类图如下:
AbstractFileDataParser类代码如下:
public abstract class AbstractFileDataParser
{
    private FileInputStream fileInputStream = null;

    public AbstractFileDataParser(FileInputStream fileInputStream)
    {
        if (fileInputStream == null)
        {
            throw new NullPointerException("file input stream is null!");
        }
        this.fileInputStream = fileInputStream;
    }

    protected FileInputStream getFileInputStream()
    {
        return this.fileInputStream;
    }

    public void release()
    {
        CloseUtil.close(fileInputStream);
    }

}

   最主要的方法就是readData,类似于BufferedReader,每次调用读取一组数据,如果还回Null,表示数据读取完成了。
   如果从项目的需要上来看,这个抽象应该是满足需求了。但现在有考虑问题,会老想着抽象,所以又想了到了一个新的抽象层:只是读取数据。这就意味着不知道什么地方获取数据,文件系统,网络等,于是需要进一步抽象,这个时候就需要定义一个IDataParser接口,类图抽象层次如下所示
IDataParser接口代码如下:

public interface IDataParser
{
    /**
     * 
     * 如果还回null,则代表没有可读取的数据了 
     * 
     * @return
     */
    Object[] readData();

    void release();

}

AbstractFileDataParser类实现IDatParser接口,代码如下:
public abstract class AbstractFileDataParser implements IDataParser
{
    private FileInputStream fileInputStream = null;

    public AbstractFileDataParser(FileInputStream fileInputStream)
    {
        if (fileInputStream == null)
        {
            throw new NullPointerException("file input stream is null!");
        }
        this.fileInputStream = fileInputStream;
    }

    protected FileInputStream getFileInputStream()
    {
        return this.fileInputStream;
    }

    public void release()
    {
        CloseUtil.close(fileInputStream);
    }
}


   这个抽象层次就比较清楚了,虽然暂时项目中只是从文件中读取数据,但并不保证以后可能会改变啊,抽象出一个接口,就很好满足了OCP。而AbstractFileDataParser类作为项目实际需求,可以实现文件读入流的获取和关闭,实现了一些共同行为。
   我想这就是接口和抽象类的最大区别了吧
  • 描述: AbstractFileDataParser
  • 大小: 1.9 KB
  • 描述: 抽象层次
  • 大小: 3 KB
分享到:
评论
13 楼 zhangguoli1997 2008-04-18  
我认为抽象类跟接口负责的功能是一样的!制定一些接口规范!其它的子类必须实现它们定义的未实现的方法!接口跟抽象类不同的地方是抽象类可以有一些方法里边有代码!当有一些代码是几个子类都有的时候就可以抽象到抽象类!如果没有公用的代码就用接口!就这么简单!
12 楼 andy54321 2008-04-17  
qmy 写道
williamy 写道
1,抽象類就是爲了extends的
2,interface是爲了多態的
如果你看過多繼承,那麽你就明白interface是多餘的,
interface害死人啊,java莫名其妙的來個interface
就是爲了讓那些沒看過c++的人明白怎麽實現多繼承
並且,其實還是一個假的多繼承

.....



这位说的太偏激了。。。。。
现在面向接口的编程不是很好很强大么,大家评价都蛮高的。
如果都用多继承而且没有interface的话,代码的黏合度不是很很高么?
这样对代码的简洁度、解耦合好像都是有些问题的。。

不知道说的对不对
11 楼 bjwdm 2008-04-17  
qmy 写道
williamy 写道
1,抽象類就是爲了extends的
2,interface是爲了多態的
如果你看過多繼承,那麽你就明白interface是多餘的,
interface害死人啊,java莫名其妙的來個interface
就是爲了讓那些沒看過c++的人明白怎麽實現多繼承
並且,其實還是一個假的多繼承

.....

。。。。。。。。。。。。。。。。。。。。


10 楼 qmy 2008-04-16  
williamy 写道
1,抽象類就是爲了extends的
2,interface是爲了多態的
如果你看過多繼承,那麽你就明白interface是多餘的,
interface害死人啊,java莫名其妙的來個interface
就是爲了讓那些沒看過c++的人明白怎麽實現多繼承
並且,其實還是一個假的多繼承

.....
9 楼 qmy 2008-04-16  
public class Cellphone extends Phone implements Bluetooth{
}
8 楼 卒子99 2008-04-16  
<p>
williamy 写道
2,interface是爲了多態的<br/>如果你看過多繼承,那麽你就明白interface是多餘的,<br/>interface害死人啊,java莫名其妙的來個interface<br/>就是爲了讓那些沒看過c++的人明白怎麽實現多繼承<br/>並且,其實還是一個假的多繼承
</p>
<p><br/>interface就是用来实现多态的,和继承有关系吗?</p>
<p>例如,如果有一个基类叫做Person,现在我需要它具有一个父亲的特性,采用继承有关系,就如下</p>
<pre name='code' class='java'> public class Father extend Person
<br/> {
<br/>     .........
<br/>    public void readStoryToBaby(){}
<br/> }
<br/></pre>
<p> </p>
<p>又出现一个老板类,又会产生以下继续关系</p>
<pre name='code' class='java'> public class Father extend Person
<br/> {
<br/>    public void meeting(){}
<br/> }
<br/>
<br/>
<br/></pre>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> 最后事业有成了,又是孩子的父亲,又是老板,那怎么做呢?我不懂C++,大概可能是这样子的</p>
<pre name='code' class='java'> public class SuccessMan extend Father,Boss
<br/>  {
<br/>    pulbic void readStoryToBaby(){}
<br/>    public void meeting(){}
<br/>  }
<br/></pre>
<p> </p>
<p>这就会有一个问题了,在公司环境中,你的雇员可以让我们的Boss讲故事,而在家里,你的孩子可能会让你给他讲故事。在系统中是没有必要,也不应该讲其它方法暴露出来的。<br/>而使用接口是很好的做到这点的</p>
<pre name='code' class='java'> public class SuccessMan implements Father,Boss
<br/>  {
<br/>    pulbic void readStoryToBaby(){}
<br/>    public void meeting(){}
<br/>  }
<br/></pre>
<p> </p>
<p>在工作环境中:</p>
<pre name='code' class='java'> public class WorkContext
<br/>  {
<br/>       public WorkdContext(Boss boss){}
<br/>  }
<br/></pre>
<p> </p>
<p>而在家里:</p>
<pre name='code' class='java'>public class Home
<br/>  {
<br/>       public Home(Father father){}
<br/>  }
<br/></pre>
<p> </p>
<p>这样不是会更优雅些吗?</p>
7 楼 williamy 2008-04-15  
1,抽象類就是爲了extends的
2,interface是爲了多態的
如果你看過多繼承,那麽你就明白interface是多餘的,
interface害死人啊,java莫名其妙的來個interface
就是爲了讓那些沒看過c++的人明白怎麽實現多繼承
並且,其實還是一個假的多繼承
6 楼 卒子99 2008-04-15  
是不是我的意思没有表述清楚呢?
大家都在讨论这个到底是什么模式,
其实我只是想表述什么时候选择用接口,什么时候选择用抽象类
5 楼 卒子99 2008-04-15  
dearmite 写道
卒子99 写道
   以前在使用接口的时候,就知道它可以抽象系统模型,便于扩展。但到底什么时候使用接口,什么时候使用抽象类,我一直也不是很清楚。但最新做了一个项目,其中遇到抽象一个系统模型的时候,让我明白了他们的用途。废话少说,直接上Case了
  需求:从文件中系统中读取数据,可支持从TXT文件,XML,XLS.....

 
   这个抽象层次就比较清楚了,虽然暂时项目中只是从文件中读取数据,但并不保证以后可能会改变啊,抽象出一个接口,就很好满足了OCP。而AbstractFileDataParser类作为项目实际需求,可以实现文件读入流的获取和关闭,实现了一些共同行为。
   我想这就是接口和抽象类的最大区别了吧



我看了一下楼主的想法,

我的感觉可能和楼主不太一致!

从多种源中读数据,这个肯定是多个实现,不用说了,
如果我来设计,
如果只是读,只有一段代码的话,那就用接口好了,不为别的,干净!

如果是读了之后,还有一段都相同的处理代码,

那就使用抽象类好了。

写两个方法,

abstract String readXML()
{
}

void dealString()
{

String aa = this.readXML();
处理aa;
}

这样不是显得更好样一点???



确实,接口越简单越好,甚至可以只是一个标识接口
但是在实际运用中可以发现,对于这种动名词命令的接口(自己定义的),非常有必须留一个方法用于清除资源,就像Connection, Reader这样的
4 楼 coreymylife 2008-04-04  
确实是模板模式
所谓模板模式就是把一系列类中相同的部分抽取出来形成抽象,不同的方法不同实现!
3 楼 dearmite 2008-04-04  
用抽象类,来实现这种中间多层的实现,

23GOF里,叫模板的模式!


有现成的用别人的成果吧,这样比较省事!
2 楼 dearmite 2008-04-04  
卒子99 写道
   以前在使用接口的时候,就知道它可以抽象系统模型,便于扩展。但到底什么时候使用接口,什么时候使用抽象类,我一直也不是很清楚。但最新做了一个项目,其中遇到抽象一个系统模型的时候,让我明白了他们的用途。废话少说,直接上Case了
  需求:从文件中系统中读取数据,可支持从TXT文件,XML,XLS.....

 
   这个抽象层次就比较清楚了,虽然暂时项目中只是从文件中读取数据,但并不保证以后可能会改变啊,抽象出一个接口,就很好满足了OCP。而AbstractFileDataParser类作为项目实际需求,可以实现文件读入流的获取和关闭,实现了一些共同行为。
   我想这就是接口和抽象类的最大区别了吧



我看了一下楼主的想法,

我的感觉可能和楼主不太一致!

从多种源中读数据,这个肯定是多个实现,不用说了,
如果我来设计,
如果只是读,只有一段代码的话,那就用接口好了,不为别的,干净!

如果是读了之后,还有一段都相同的处理代码,

那就使用抽象类好了。

写两个方法,

abstract String readXML()
{
}

void dealString()
{

String aa = this.readXML();
处理aa;
}

这样不是显得更好样一点???
1 楼 zfms 2008-04-04  
楼主写的有些不是很明确,能在完善一些嘛?既然实现了IDataParser 接口,为什么没有接口实现?

相关推荐

    详细解析Java中抽象类和接口的区别

    - **抽象类**:继承抽象类使用`extends`关键字。 - **接口**:实现接口使用`implements`关键字。 这反映了两者在概念上的不同定位:抽象类强调的是“是什么”的关系(例如,狗是动物的一种),而接口强调的是“能做...

    接口与抽象类区别

    接口与抽象类区别 在软件开发中,接口和抽象类是两个常用的概念,但它们之间的区别却让许多人感到困惑。那么,什么是抽象类和接口?它们之间有什么区别?下面,我们就来详细地探讨这个问题。 一、抽象类 抽象类是...

    接口和抽象类使用详细实例源代码

    在编程世界中,接口(Interface)和抽象类(Abstract Class)是面向对象设计的...通过阅读和分析“接口和抽象类使用详细实例源代码”,开发者可以更好地掌握这两种重要概念,并将其应用到自己的项目中,提升软件质量。

    java 抽象类与接口的练习

    在Java编程语言中,抽象类和接口是两种重要的面向对象设计概念,它们允许我们定义规范,供其他类去实现或继承。在这个练习中,我们将深入理解这两种机制,并通过实际的代码示例和注释来加深理解。 首先,让我们讨论...

    C#抽象类与接口方法

    【C#抽象类与接口方法】在C#编程语言中,抽象类和接口是两种用于实现多态性和封装的关键概念,它们允许我们设计灵活、可扩展的代码结构。 抽象类是一种特殊的类,它不能被实例化,而是作为其他类的基类使用。抽象类...

    Java 接口和抽象类

    在 Java 中,抽象类使用 abstract 关键字声明。 在上面的练习中,我们使用抽象类来编写 Java 程序。首先,我们创建了一个名为 LivingThing 的抽象类,该类表示生物类。然后,我们创建了两个具体实现类:Human 和 ...

    Java抽象类与接口实验报告

    Java抽象类与接口实验报告

    C#类、接口、虚方法和抽象方法-抽象类和接口的相同点和区别

    在C#编程语言中,类、接口、虚...在选择使用抽象类还是接口时,应根据项目需求和设计原则来权衡。例如,如果需要共享部分实现并有继承关系,可以选择抽象类;如果需要多个类实现一组共同行为,接口可能是更好的选择。

    java利用接口和抽象类改写求圆的面积和梯形的面积.docx

    在了解了接口和抽象类的定义和使用格式之后,我们可以根据以下几点来选择使用接口还是抽象类: 1. **成员实现详情**:抽象类可以提供成员的实现详情,而接口不能。如果你希望在抽象类中提供某些方法的默认实现,则...

    接口抽象类

    本文将深入探讨“接口抽象类”的主题,包括它们的概念、用途、区别以及在Java编程语言中的实现。 首先,让我们了解什么是接口。接口在Java中是一种完全抽象的类型,它只包含方法签名(方法名、返回类型和参数列表)...

    java抽象类与接口实例java抽象类与接口实例

    java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例java抽象类与接口实例...

    java中接口与抽象类的详细分析与比较

    在Java编程语言中,接口(Interface)和抽象类(Abstract Class)都是用于实现多态性的关键概念,它们各自有特定的用途和优缺点。本文将深入探讨这两种概念,帮助你理解它们之间的区别以及如何在实际开发中选择使用...

    c# 中抽象类和接口的学习

    在实际开发中,选择使用抽象类还是接口取决于你的具体需求。如果你需要共享一些通用的实现逻辑,或者需要强制派生类遵循某种结构,那么抽象类可能是更好的选择。相反,如果你的目标是提供一组操作的契约,让多个类...

    C#接口抽象类区别实例

    c#中抽象类和接口。 相同点: (1) 都可以被继承 (2) 都不能被实例化 (3) 都可以包含方法声明 (4) 派生类必须实现未实现的方法 区 别: (1) 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、...

    Java继承_抽象类与接口的应用.

    1.继承及继承实例 2.方法重写(Overwrite) 3.super关键字 4.方法重载(Overload) 5.final修饰符 6.abstract修饰符 7.抽象类 8.接口 9.接口和抽象类对比 10.接口和抽象类使用场合实例 11.总结

    抽象类和接口实验报告.doc

    抽象类和接口实验报告

    java 抽象类与接口的区别

    例如,在设计模式中,工厂模式通常使用抽象类,而策略模式则倾向于使用接口。 理解抽象类与接口的区别并恰当运用,有助于提升代码的可扩展性和可维护性,使得软件设计更加灵活和面向对象。在进行Java编程时,应根据...

    Java语言的接口与抽象类

    在选择使用抽象类还是接口时,需要根据实际需求权衡。如果需要共享代码和方法,或者希望强制子类实现特定行为,抽象类是合适的选择。如果希望解耦系统,提供更灵活的扩展性,或者保护实现的细节,接口是更好的选择。

    Java实验7抽象类和接口.pdf

    抽象类和接口 ...通过这个实验,我们学习了抽象类、接口、Cloneable 接口和多态性的概念,并掌握了如何使用它们来编写 Java 程序。我们还学习了浅拷贝和深拷贝的概念,并掌握了如何消除浅拷贝的方法。

    抽象类和接口

    在编程领域,抽象类和接口是面向对象设计中的两个重要概念,它们用于实现代码的抽象和多态性。本实验旨在帮助你深入理解和熟练运用这两种机制。 首先,让我们来看看抽象类。抽象类是一种不能被实例化的类,它通常...

Global site tag (gtag.js) - Google Analytics