JAVA接口的见解(美文共欣赏)

2019-08-07 18:55:36 标题分类:原创美文 关键词:美文共欣赏 阅读:79

转载地点:

大多数人认为,接口的意义在于顶替多重继承。众所周知Java没有c++那样多重继承的机制,但是却能够实作多个接口。实在如此做是很牵强的,接口和继承是完全差别的东西,接口没有才能取代多重继承,也没有这个义务。接口的感化,一言以蔽之,就是标记类的种别(type of class)。把差别范例的类归于差别的接口,可以更好的管理他们。OO的精髓,我认为,是对对象的笼统,最能体现这一点的就是接口。为甚么我们辩论设想形式都只针对具有了抽象才能的言语(比如c++、java、c#等),就是由于设想形式所研究的,现实上就是怎样合理的去笼统。(cowboy的名言是“笼统就是抽去像的部分”,看似讥讽,实乃至理)。

设想形式中最基础的是工场形式(Factory),在我最近的一个很简朴的利用中,我想尽大概的让我的程序能够在多个数据库间移植,固然,这触及很多成绩,单是怎样兼容差别DBMS的SQL就让人头痛。我们无妨先把成绩简朴化,只考虑怎样毗邻差别的数据库。

假定我有很多个类,分别是他们分别毗邻差别的数据库,同一返回一个Connection对象,而且都有一个close方式,用于封闭毗邻。只需求针对你的DBMS,挑选差别的类,便可以用了,但是我的用户他会使用甚么数据库?我不晓得,我希望的是尽大概少的点窜代码,就可以知足他的需求。我可以笼统以下接口:

package  interface DB
{
   openDB(String url,String user,String password);
  void close();
}

这个接口只界说两个方式,没有任何有现实意义的代码,具体的代码由实作这个接口的类来给出,比如

Package   class Mysql implements DB
{
  private String url=”jdbc:mysql:localhost:3306/test”;
  private String user=”root”;
  private String password=””;
  private Connection conn;
  public Connection openDB(url,user,password)
  {
    //毗邻数据库的代码
  }

  public void close()
  {
    //封闭数据库
  }
}

类似的固然另有等等,接口DB给这些类归了个类,在利用程序中我们如此界说对象:

   myDB;

myDB来操纵数据库,便可以不消管现实上我所使用的是哪一个类,这就是所谓的“开-闭”原则。但是成绩在于接口是不能实例化的,myDB=new DB(),如此的代码是绝对错误的,我们只能myDB=new Mysql()大概myDB=new Oracle()。贫苦了,我还是需求指定具体实例化的是哪一个类,用了接口跟没用一样。以是我们需求一个工场:

package  class DBFactory
{
  public static DB Connection getConn()
  {
    Return(new Mysql());
  }
}


以是实例化的代码变成:myDB=

这就是23种形式中最基础的普通工场(Factory),工场类负责具体实例化哪一个类,而其他的程序逻辑都是针对DB这个接话柄行操纵,这就是“针对接口编程”。责任都被推辞给工场类了,固然你也能够继承界说工场接口,继承把义务上抛,这就演变成笼统工场(Abstract Factory)。

全部历程中接口不负义务何具体操纵,其他的程序要毗邻数据库的话,只需求构造一个DB对象就OK,而不督工场类怎样变革。这就是接口的意义----笼统。

继承的概念不消多说,很好明白。为甚么要继承呢?由于你想重用代码?这绝对不是来由,继承的意义也在于笼统,而不是代码重用。如果对象A有一个run()方式,对象B也想有这个方式,以是有人就Class B extends A。这是不经大脑的做法。如果在B中实例化一个A,调用A的Run()方式,能否是可以到达一样的目的?以下:

Class B
{
  A a=new A();
  a.run();
}

这就是利用类的聚合来重用代码,是委派形式的雏形,是GoF一向倡导的做法。

那么继承的意义安在?实在这是汗青原因酿成的,最开始的OO言语只要继承,没有接口,以是只能以继承来实现笼统,请一定留意,继承的本意在于笼统,而非代码重用(虽然继承也有这个感化),这是很多Java烂书最严峻的错误之一,它们所酿成的暗影,我至今还没有完全摆脱,坏书害人啊,尤其是入门类的,流毒太大。甚么时候应当使用继承?只在笼统类中使用,其他情况下尽大概不使用。笼统类也是不能实例化的,它仅仅供应一个模版罢了,这就很能说明成绩。

软件开辟的万恶之源,一是反复代码而不是重用代码,二是烂用继承,尤以c++程序员为甚。Java中取消多重继承,目标就是克制烂用继承,实长短常明智的做法,不过很多人都不明白。Java能够更好的体现设想,这是让我出神的原因之一。

联系电话: 联系邮箱: 客服QQ: