Java - 为什么要使用接口编程【转】
看了接口編程這篇文章,理解蠻透徹的.記錄下:
進(jìn)行接口的介紹,必須介紹一下程序語言發(fā)展的歷史才行,魯迅先生說過“治學(xué)先治史”,明白了程序語言發(fā)展的前世今生,才能知道為什么這么多語言為什么會這樣,為什么么會那樣?
計算機(jī)出現(xiàn)以后,科學(xué)家相繼開發(fā)了多種語言,從smalltalk,Pascal,Basic,C語言,C++,java,.net等等,這些語言的發(fā)展步伐,可以看作是從面向過程向面向?qū)ο蟀l(fā)展的一段歷史。很多面向?qū)ο蟮臅诮榻B自己的歷史的時候,都會給讀者介紹這一段歷史,并鼓吹OO編程是多么多么的優(yōu)異。問題是,很多剛開始學(xué)程序的人根本不知道為什么要有這個轉(zhuǎn)變,他們也很難理解OO語言中的虛函數(shù),接口等概念到底為了什么而提出來。
我們在了解這一段歷史以前,首先給大家介紹一個概念——“粒度”,什么是粒度?作者認(rèn)為所謂粒度其實(shí)就是一個程序中使用代碼單元的組合尺度,我們可以舉一個例子,沙礫——磚塊——房屋模板,我們設(shè)想去修建一座房子,其實(shí)有很多中修筑方法,如果你不閑麻煩,可以使用沙礫一點(diǎn)點(diǎn)地建筑,或者將沙礫燒制為磚塊,用磚塊來砌,甚至直接從工廠購買房屋的門,窗,墻組件來堆砌。這三種不同的方法代表了三種不同的組合尺度。沙礫是最小的單位,使用它搭建小的房子說不定還可以,但是毫無疑問,我們必須使用很多很多“沙礫”,不便于管理;磚塊比沙礫聚合了一層,可以用來修建較大的房子了;房屋模板是最高的尺寸,使用它可以快速地搭建大規(guī)模的房屋。這三種尺度的區(qū)別和聯(lián)系,與我們編寫程序概念是有很大的相似之處的。
在早期學(xué)習(xí)Pascal,老師告訴我們這種面向過程語言的最基本的單元是過程和函數(shù),它們是程序中的最小的組件。過程和函數(shù)可以實(shí)現(xiàn)最基本的代碼重用,當(dāng)我們把某些固定功能的代碼使用過程和函數(shù)編寫后,我們可以在程序中調(diào)用它們而不必在任何需要的地方都寫上這樣一段代碼,這樣的好處是顯而易見的。在一些小型的程序里面,使用過程和函數(shù)是合適的,但是在大中型程序中,它們的弊端就顯示出來,過程和函數(shù)的粒度太低了,如果我們一個系統(tǒng),有10000個函數(shù)和過程,我們的程序員將不得不花費(fèi)大量的時間去尋找和維護(hù)它們,10000個沒有任何關(guān)系的函數(shù)和過程的管理難度是顯而易見的,就好像10000個人的企業(yè)一樣,如果沒有部門和職務(wù),這還不亂了套?!
面向?qū)ο笳Z言的出現(xiàn),就是為了解決這個問題,別聽OO語言吹的天花亂墜,其實(shí)它出現(xiàn)就為一個理由——提高編程的粒度。面向?qū)ο笳Z言的基本單位是類 CLASS,類封裝了很多數(shù)據(jù)成員和成員函數(shù),過程,將最小組件的提高了一個等級,我們需要直接操作的不是過程和函數(shù)了,而是一個個更高層次上的類。我們把10000人分了很多部門,不同的部門負(fù)責(zé)不同的事宜,這樣公司終于可以走上正軌了。
做成了類CLASS是否就萬事大吉了呢?不一定,新的問題隨之而來,也許我們有一個部門的人很多,可以做很多事情,如何在部門內(nèi)部實(shí)現(xiàn)更好的管理呢?好比我們有一個類,它提供了很多種方法和屬性,這些方法和屬性其實(shí)可以分為一堆堆,為不同的功能服務(wù),但是我們的類并沒有做這個管理。在AO種,map對象擁有很多功能,比如管理圖層,管理元素,管理選擇集,進(jìn)行地圖顯示,每種不同的功能都有好多方法和屬性,現(xiàn)在這些屬性和方法是雜亂無章,沒有任何區(qū)別堆積在一個類里面的,當(dāng)我們的程序員需要尋找一個方法的時候,不得不一個個去尋找,很不方便。
這個時候,接口interface出現(xiàn)了,C++的發(fā)明者第一次提出純虛函數(shù)(其實(shí)就是接口)概念的時候,遭到了很多抵制,很多人都不明白接口的意義何在,我們用虛函數(shù)好好的,何必又出來個啥東西都沒有的空架子?說它是類吧,又不能實(shí)現(xiàn)產(chǎn)生一個對象;說它是對象吧,又沒有方法體來使用。接口出來干了一件好事,就是將類內(nèi)部進(jìn)行分類。對于map對象,我們可以做好幾個接口,這些接口中定義不同功能的方法,函數(shù)和屬性,map類實(shí)現(xiàn)這些接口,這樣我們可以使用接口定義,實(shí)現(xiàn)對象。因此,所謂接口就是一系列相關(guān)方法與屬性集合的定義。
Dim pGraphicsContainer as iGraphicsContainer
pGraphicsContainer=application.document.ActiveView.focusMap
pGraphicsContainer可以使用的屬性和方法就只能是它定義的那部分了,而不能使用管理元素等的接口定義的方法和屬性,那我們?nèi)绾问褂闷渌墓δ苣?#xff1f;這就是所謂的QI(Query Interface)功能。從一個接口查詢另一個接口。
Dim pGeoFeatureLayer as iGeofeatureLayer
pGeoFeatureLayer= pGraphicsContainer?????? QI
好了,我們羅嗦了這么多,已經(jīng)走進(jìn)了COM的概念了,在正式介紹COM以前我們得最后羅嗦一點(diǎn):計算機(jī)語言的發(fā)展歷史,其實(shí)就是一部不斷提高組件粒度的歷史,不斷提高代碼重用的歷史。以前我們使用過程和函數(shù),后來我們使用類,現(xiàn)在我們使用接口,都是為了一個目的,讓我們操作的組件在具體和抽象之間尋找一個平衡點(diǎn)。太具體了,如過程和函數(shù),就沒有了框架;太抽象,如類,就無法分別。
一個代碼示例:
public interface IForm
{
??? void Show();
??? void ShowDialog();
}
public class A:IForm
{
??? public void Show()
{
}
??? public void ShowDialog()
{
}
}
public class B:IForm
{
??? public void Show()
{
}
??? public void ShowDialog()
{
}
}
public class FormFactory
{
?? public static IForm CreateInstance(string parm)
?? {
?????
????? if? (parm == "A")
????? {
???????? return new A();
????? else if (parm == "B")
???????? return new B();
?????? }
????? return null;
?? }
}
本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/ouyangmeile/archive/2009/02/14/3889890.aspx
總結(jié)
以上是生活随笔為你收集整理的Java - 为什么要使用接口编程【转】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国式考试的弊病
- 下一篇: 51单片机(STC89C52RC) IO