為什麼要使用介面編程)

來源:互聯網
上載者:User
為什麼要使用介面編程(轉)看了介面編程這篇文章,理解蠻透徹的.記錄下:

進行介面的介紹,必須介紹一下程式語言發展的曆史才行,魯迅先生說過“治學先治史”,明白了程式語言發展的前世今生,才能知道為什麼這麼多語言為什麼會這樣,為什麼麼會那樣?

電腦出現以後,科學家相繼開發了多種語言,從smalltalk,Pascal,Basic,C語言,C++,java,.net等等,這些語言的發展步伐,可以看作是從面向過程向物件導向發展的一段曆史。很多物件導向的書在介紹自己的曆史的時候,都會給讀者介紹這一段曆史,並鼓吹OO編程是多麼多麼的優異。問題是,很多剛開始學程式的人根本不知道為什麼要有這個轉變,他們也很難理解OO語言中的虛函數,介面等概念到底為了什麼而提出來。

我們在瞭解這一段曆史以前,首先給大家介紹一個概念——“粒度”,什麼是粒度?作者認為所謂粒度其實就是一個程式中使用代碼單元的組合尺度,我們可以舉一個例子,沙礫——磚塊——房屋模板,我們設想去修建一座房子,其實有很多中修築方法,如果你不閑麻煩,可以使用沙礫一點點地建築,或者將沙礫燒製為磚塊,用磚塊來砌,甚至直接從工廠購買房屋的門,窗,牆組件來堆砌。這三種不同的方法代表了三種不同的組合尺度。沙礫是最小的單位,使用它搭建小的房子說不定還可以,但是毫無疑問,我們必須使用很多很多“沙礫”,不便於管理;磚塊比沙礫彙總了一層,可以用來修建較大的房子了;房屋模板是最高的尺寸,使用它可以快速地搭建大規模的房屋。這三種尺度的區別和聯絡,與我們編寫程式概念是有很大的相似之處的。

在學齡前學習Pascal,老師告訴我們這種面向過程語言的最基本的單元是過程和函數,它們是程式中的最小的組件。過程和函數可以實現最基本的代碼重用,當我們把某些固定功能的代碼使用過程和函數編寫後,我們可以在程式中調用它們而不必在任何需要的地方都寫上這樣一段代碼,這樣的好處是顯而易見的。在一些小型的程式裡面,使用過程和函數是合適的,但是在大中型程式中,它們的弊端就顯示出來,過程和函數的粒度太低了,如果我們一個系統,有10000個函數和過程,我們的程式員將不得不花費大量的時間去尋找和維護它們,10000個沒有任何關係的函數和過程的管理難度是顯而易見的,就好像10000個人的企業一樣,如果沒有部門和職務,這還不亂了套?!

物件導向語言的出現,就是為瞭解決這個問題,別聽OO語言吹的天花亂墜,其實它出現就為一個理由——提高編程的粒度。物件導向語言的基本單位是類 CLASS,類封裝了很多資料成員和成員函數,過程,將最小工具的提高了一個等級,我們需要直接操作的不是過程和函數了,而是一個個更高層次上的類。我們把10000人分了很多部門,不同的部門負責不同的事宜,這樣公司終於可以走上正軌了。

做成了類CLASS是否就萬事大吉了呢?不一定,新的問題隨之而來,也許我們有一個部門的人很多,可以做很多事情,如何在部門內部實現更好的管理呢?好比我們有一個類,它提供了很多種方法和屬性,這些方法和屬性其實可以分為一堆堆,為不同的功能服務,但是我們的類並沒有做這個管理。在AO種,map對象擁有很多功能,比如管理圖層,管理元素,管理選擇集,進行地圖顯示,每種不同的功能都有好多方法和屬性,現在這些屬性和方法是雜亂無章,沒有任何區別堆積在一個類裡面的,當我們的程式員需要尋找一個方法的時候,不得不一個個去尋找,很不方便。

這個時候,介面interface出現了,C++的發明者第一次提出純虛函數(其實就是介面)概念的時候,遭到了很多抵制,很多人都不明白介面的意義何在,我們用虛函數好好的,何必又出來個啥東西都沒有的空架子?說它是類吧,又不能實現產生一個對象;說它是對象吧,又沒有方法體來使用。介面出來幹了一件好事,就是將類內部進行分類。對於map對象,我們可以做好幾個介面,這些介面中定義不同功能的方法,函數和屬性,map類實現這些介面,這樣我們可以使用介面定義,實現對象。因此,所謂介面就是一系列相關方法與屬性集合的定義。

Dim pGraphicsContainer as iGraphicsContainer
pGraphicsContainer=application.document.ActiveView.focusMap
pGraphicsContainer可以使用的屬性和方法就只能是它定義的那部分了,而不能使用管理元素等的介面定義的方法和屬性,那我們如何使用其它的功能呢?這就是所謂的QI(Query Interface)功能。從一個介面查詢另一個介面。

Dim pGeoFeatureLayer as iGeofeatureLayer
pGeoFeatureLayer= pGraphicsContainer QI

好了,我們羅嗦了這麼多,已經走進了COM的概念了,在正式介紹COM以前我們得最後羅嗦一點:電腦語言的發展曆史,其實就是一部不斷提高組件粒度的曆史,不斷提高代碼重用的曆史。以前我們使用過程和函數,後來我們使用類,現在我們使用介面,都是為了一個目的,讓我們操作的組件在具體和抽象之間尋找一個平衡點。太具體了,如過程和函數,就沒有了架構;太抽象,如類,就無法分別。

一個程式碼範例:
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;
}
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.