重繼承、介面和異常處理 (轉)

worldblog發表於2007-12-04
重繼承、介面和異常處理 (轉)[@more@]

重繼承、介面和異常處理
2000-12-23· Adding翻譯·yesky

--------------------------------------------------------------------------------


多重繼承和介面

  一些面向語言允許一個類從多個基類中繼承,而另一些面嚮物件語言只允許從一個類繼承,但可以隨意從幾個介面或純抽象類中繼承。一個純抽象類是隻含有純虛的類。

  只有C++支援多個介面,許多員對此褒貶不一。由多個介面引發的虛基類的概念雖然不易讓人掌握,但它的功能是強大的。C++沒有介面概念。

  和 Pascal一樣,雖沒有多重繼承,但卻全面支援多個介面。介面的方法支援多型性,當需要一個介面物件時,就可以透過物件實現一個介面。一個類可以繼承或擴充套件一個已有多個介面的基類。例如:

public interface CanFly {
public void Fly();
}
public class Bat extends Animal implements CanFly {
public void Fly( ) { // the bat flies... }
}

  引入Object Pascal的Dephi 3 有與Java介面相似的概念,但這些概念和COM對映得非常好。Dephi 3的介面是和類的繼承分開的,而Java的類不僅可以從基類繼承,而且可以有多個介面。

  一個強壯型別的面嚮物件語言編譯時必然需要全部的型別檢查,但有時還必需在執行程式時保留一些型別和類的資訊。基於這種考慮,Java 、C++和Object Pascal都支援在更高或較小範圍內的ntification或Information執行型別檢查。RTTI用於Identification和Information兩者的執行型別檢查。

  C++一開始是不支援RTTI的,後來加上dynamic_cast用來得到一些類的型別資訊。

  Object Pascal和它的視覺化環境支援許多RTTI。它不僅支援型別檢查和is或as操作,而且為每個published元素產生更廣泛的RTTI。實際上,published這個關鍵字影響產生的RTTI資訊。所有屬性的概念、流機制、環境以及物件檢測的開始,在很在程度上取決於RTTI。TObject有ClassName和ClassType方法,ClassType返回類的型別變數,一個特殊指定類的例項。

  同Object Pascal相同,Java也有一個基類來保持對類資訊的跟蹤。Object的getClass()用來返回一種型別的元類(用來描述類的物件),getName()函式返回類的字串名。也可使用instanceof來關注視覺化環境和的程式。

  下面的例子來說明上述三種語言的不同:

// C++
Dog* MyDog = dynamic_cast (myAnimal);
// Java
Dog MyDog = (Dog) myAnimal;
// Object Pascal
Dog myDog := myAnimal as Dog;


異常處

  異常處理的基本思想是簡化程式的錯誤程式碼,為程式鍵壯性提供一個標準檢測機制。由於異常內容太多,故這裡僅討論主要的元素和差別。

  C++使用throw關鍵字來產生異常,try關鍵字用來檢測的程式塊,catch關鍵字用來填寫異常處理的程式碼。異常可以由一個確定類或派生類的物件產生。C++能釋放堆疊,並可清除堆疊中所有的物件。

  Object Pascal使用和C++相似的關鍵字raise、try和except,並有相同的,但卻不能釋放堆疊,這是因為堆疊中沒有物件。當然,也可選擇finally關鍵字來讓程式程式碼一直,而忽視異常的產生。Delphi異常類是從Exception派生的。

  Java使用C++一樣的關鍵字,但它的一些行為和Object Pascal是一致的,包括finally關鍵字。這一點可能是因為Java使用物件引用模型和後臺垃圾回收機制的緣故吧。Java物件的類必須從Throwable類派生。


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988178/,如需轉載,請註明出處,否則將追究法律責任。

相關文章