版本控制(Versioning)主要是為了解決組件的版本不兼容的問題。版本兼容的方式有:
●源代碼級兼容:依賴於舊版本的代碼在重新編譯之後能夠與新版本兼容。
●二進制兼容:依賴於舊版本的應用程序無需重新編譯就能與新版本兼容。
大多數語言根本不支持二進制級的版本兼容,其中許多在源代碼級的兼容問題上也表現的不盡如人意。事實上,許多語言由於自身的缺陷,不改寫客戶代碼就不可能實現組件的升級。
舉個例子,假設基類的作者寫了一個叫Base的類。在第一個版本中,類Base中沒有包含方法F。一個叫Derived的類從Base中繼承,並且聲明了一個方法F。類Derived和類Base一同被交付客戶使用,並且配置到許多客戶機和服務器上。
// Author A namespace A { public class Base //version 1 { } } //Author B namespace B { class Derived:A.Base { public virtual void F(){ System.Console.WriteLine("Derived.F"); } } }
到目前為止,程序的運行一切正常。然後,Base類的作者提供了一個新版本,給類Base添加了一個方法F。
//Author A namespace A { public class Base //version 2 { public virtual void F(){ //added in version 2 System.Console.WriteLine("Base.F"); } } }
新版本的Base應該和舊版本保持源代碼級兼容和二進制級兼容。不幸的是,類Base中的新方法與類Derived中的F產生了混淆。Derived應該重載Base中的F嗎?看上去不應該,因為Derived已經被編譯,那時Base中甚至還沒有F!但是,如果Derived中的F不重載Base中的F,而它又必須符合基類Base的聲明,可是在寫Derived類時還不存在該聲明。比如某種情況下,Base中的F可能要求被重載。
在解決版本問題時,C#要求開發人員清楚地表達他們的意圖。在原始代碼中,類Base不包括方法F,所以不存在什麼問題。Derived中的F是作為一個新方法,而不是重載基類中的方法。
//Author A namespace A { public class Base { } } //Author B namespace B { class Derived:A.Base { public virtual void F(){ System.Console.WriteLine("Derived.F"); } } }-