亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

澄清Java語言接口與繼承的本質

2019-11-18 13:09:10
字體:
來源:轉載
供稿:網友

  計算機學院研二的兄弟與我討論java,一見面,幾個問題全是關于接口,接口有什么用?為什么要用接口?什么時候該使用接口?很慶幸他們不是問我Java如何連接SQL Server,或者是如何開發J2EE應用,這類問題有殺傷力,避之則吉。今年計算機學院本科有個畢業設計課題是做J2ME,選這個題目的學生在5月末都還在苦著臉研究java.util.*這個包,這個這個……唉。
  
  大多數人認為,接口的意義在于頂替多重繼續。眾所周知Java沒有c++那樣多重繼續的機制,但是卻能夠實作多個接口。其實這樣做是很牽強的,接口和繼續是完全不同的東西,接口沒有能力代替多重繼續,也沒有這個義務。接口的作用,一言以蔽之,就是標志類的類別(type of class)。把不同類型的類歸于不同的接口,可以更好的治理他們。OO的精髓,我以為,是對對象的抽象,最能體現這一點的就是接口。為什么我們討論設計模式都只針對具備了抽象能力的語言(比如c++、java、c#等),就是因為設計模式所研究的,實際上就是如何合理的去抽象。(cowboy的名言是“抽象就是抽去像的部分”,看似調侃,實乃至理)。
  
  設計模式中最基礎的是工廠模式(Factory),在我最近的一個很簡單的應用中,我想盡量的讓我的程序能夠在多個數據庫間移植,當然,這涉及很多問題,單是如何兼容不同DBMS的SQL就讓人頭痛。我們不妨先把問題簡單化,只考慮如何連接不同的數據庫。
  
  假設我有很多個類,分別是MySQL.java、SQLServer.java、Oracle.java、DB2.java,他們分別連接不同的數據庫,統一返回一個Connection對象,并且都有一個close方法,用于關閉連接。只需要針對你的DBMS,選擇不同的類,就可以用了,但是我的用戶他會使用什么數據庫?我不知道,我希望的是盡量少的修改代碼,就能滿足他的需要。我可以抽象如下接口:
  
  package org.bromon.test;
  public interface DB
  {
  java.sql.Connection openDB(String url,String user,String passWord);
  void close();
  }
  
  這個接口只定義兩個方法,沒有任何有實際意義的代碼,具體的代碼由實作這個接口的類來給出,比如Mysql.java:
  
  Package org.bromon.test;
  import java.sql.*;
  public 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()
  {
  //關閉數據庫
  }
  }
  
  類似的當然還有Oracle.java等等,接口DB給這些類歸了個類,在應用程序中我們這樣定義對象:
  
  org.bromon.test.DB myDB;
  
  使用myDB來操作數據庫,就可以不用管實際上我所使用的是哪個類,這就是所謂的“開-閉”原則。但是問題在于接口是不能實例化的,myDB=new DB(),這樣的代碼是絕對錯誤的,我們只能myDB=new Mysql()或者myDB=new Oracle()。麻煩了,我還是需要指定具體實例化的是哪個類,用了接口跟沒用一樣。所以我們需要一個工廠:
  
  package org.bromon.test;
  public class DBFactory
  {
  public static DB Connection getConn()
  {
  Return(new Mysql());
  }
  }
  
  所以實例化的代碼變成:myDB=DBFactory.getConn();
  
  這就是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能夠更好的體現設計,這是讓我入迷的原因之一。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近免费中文字幕视频2019| 97在线日本国产| 久久久97精品| 亚洲韩国日本中文字幕| 欧美激情在线观看| 国产精品视频一区二区高潮| 精品久久久久久久久国产字幕| 91精品国产777在线观看| 亚洲国产精品电影在线观看| 久久在线观看视频| 亚洲另类xxxx| 欧美性xxxxx极品| 亚洲精品国产精品自产a区红杏吧| 超碰91人人草人人干| 欧美与欧洲交xxxx免费观看| 九九热这里只有精品6| 精品中文字幕在线2019| 91免费观看网站| 亚洲精品一区二区在线| 久久精品国产亚洲一区二区| 日韩hd视频在线观看| 欧美日韩国产一区在线| 欧美一级成年大片在线观看| 久久久噜噜噜久久中文字免| 成人www视频在线观看| 久久久亚洲国产天美传媒修理工| 欧美激情一区二区三级高清视频| 精品久久久国产精品999| 欧美黑人国产人伦爽爽爽| 在线播放国产精品| 91亚洲精品久久久| 亚洲视频在线观看免费| 久久伊人精品一区二区三区| 日韩av免费在线看| 亚洲精品美女久久| 国语自产精品视频在线看| 琪琪第一精品导航| 一区二区成人精品| 国产精品久久久久久av福利软件| 高清亚洲成在人网站天堂| 欧美一区二区影院| 久久久999精品| 一区二区av在线| 国产精品美女呻吟| 欧美精品久久久久a| 亚洲无亚洲人成网站77777| 久久久久久久999| 成人做爽爽免费视频| 色一区av在线| 欧美日韩成人网| 国色天香2019中文字幕在线观看| 成人欧美一区二区三区在线湿哒哒| 久久久久久久久久久网站| 国产欧美日韩精品在线观看| 亚洲第一福利视频| 亚洲视频免费一区| 97国产在线观看| 欧美华人在线视频| 欧美成年人视频网站| xxxx性欧美| 日韩av资源在线播放| 亚洲激情视频在线| 精品免费在线视频| 欧美怡春院一区二区三区| 精品亚洲国产成av人片传媒| 色噜噜狠狠狠综合曰曰曰88av| 久久视频中文字幕| 欧美视频一区二区三区…| 亚洲性无码av在线| 一色桃子一区二区| 日韩欧美国产高清91| 亚洲成人网在线观看| 亚洲成人av资源网| 久久精品视频播放| 精品国产精品三级精品av网址| 91最新在线免费观看| 国产亚洲精品高潮| 亚洲视频在线观看网站| 亚洲欧洲美洲在线综合| 精品久久久视频| 国产精品久久久久久久午夜| 亚洲视频日韩精品| 日本成人激情视频| 亚洲精品不卡在线| 欧美视频国产精品| 日韩av在线资源| 国产亚洲免费的视频看| 欧美性猛交xxxx| 少妇av一区二区三区| 九色精品美女在线| 亚洲欧美在线免费| zzijzzij亚洲日本成熟少妇| 久久久久中文字幕2018| 欧美另类暴力丝袜| 海角国产乱辈乱精品视频| 欧美刺激性大交免费视频| 亚洲欧美国产制服动漫| 亚洲性xxxx| 97久久久久久| 国产成人在线亚洲欧美| 成人福利网站在线观看| 一区二区三区国产视频| 国产美女精品视频免费观看| 日本中文字幕成人| 丁香五六月婷婷久久激情| 亚洲一区二区三区sesese| 日韩欧美在线网址| 久久国产天堂福利天堂| 久久久精品一区| 亚洲直播在线一区| 久久视频中文字幕| 亚洲欧美激情精品一区二区| 97色在线视频观看| 欧美亚洲国产成人精品| 欧美午夜无遮挡| 亚洲综合第一页| 97色在线观看免费视频| 亚洲深夜福利在线| 8x海外华人永久免费日韩内陆视频| 欧美日韩在线视频一区二区| 9.1国产丝袜在线观看| 秋霞av国产精品一区| 亚洲乱码av中文一区二区| 日韩亚洲欧美中文在线| 国产做受69高潮| 韩国三级日本三级少妇99| 欧美在线视频播放| 日韩经典中文字幕| 亚洲护士老师的毛茸茸最新章节| 国产美女久久精品香蕉69| 奇米一区二区三区四区久久| 久久精品男人天堂| 欧美天天综合色影久久精品| 久久久久久久999| 国产精品爽爽ⅴa在线观看| 色综合久久久888| 亚洲第一视频网站| 日韩中文字幕国产精品| 欧美精品videossex性护士| 久久精品亚洲精品| www.欧美视频| 国产91色在线播放| 日韩欧亚中文在线| 欧美成人免费网| 日本精品久久电影| 欧美一区二区大胆人体摄影专业网站| 国产精品入口日韩视频大尺度| 色老头一区二区三区在线观看| 亚洲综合色激情五月| 久久久国产一区| 欧美性生交xxxxxdddd| 日韩精品在线影院| 国产成人福利视频| 国产日韩欧美自拍| 美日韩丰满少妇在线观看| 久久国产精品影片| 亚洲国产三级网| 国产精品免费久久久| 久久久成人av| 97热精品视频官网| 不卡av在线播放| 国产91精品青草社区| 亚洲国产成人91精品| 欧美国产视频一区二区|