天天看點

C#學習筆記(十二)-- 定義類

一、類的相關概念

  類的在預設情況下的聲明是内部的,也可以通過internal關鍵字來顯式聲明,内部的類隻能在項目内部被通路。

  用public關鍵字可以将一個類指定為公共,這個類可以被其他項目中的代碼通路。

  此外,還可以指定類是抽象的abstract(不能執行個體化,隻能繼承,可以有抽象成員),或者密封的sealed(隻能執行個體化,不能繼承),抽象類和密封類也分為内部的和外部的。

  可以在類的定義中指定繼承,在類名後加上冒号,其後是基類名,編譯器不允許派生類的可通路性高于基類。如果沒有指定使用基類,被定義的類就隻能繼承于基類System.Object。

二、接口的相關概念

  接口的定義方式與類相似,用的關鍵字是interface而不是class,類的冒号後面可以接上一個基類和多個接口。

  接口也有内部和外部之分,預設為内部,若要定義為外部就需要使用關鍵字public。但是接口不能定義為abstract或sealed。

  接口也可以進行繼承,但一個接口可以繼承多個接口,接口不是類,沒有繼承System.Object,是以不能用執行個體化類的方式來執行個體化一個接口。

三、System.Object

  所有的類最終都是繼承于基類System.Object,是以這些類都可以通路該類中收到胡的成員和公共成員。System.Object包含的方法主要有:

  1)Object():System.Object的構造函數,由派生類型的構造函數自動調用;

  2)~Object()(也成為Finalize()):System.Object的析構函數,由派生類型的析構函數自動調用,不能手動調用;

  3)Equals(object):把調用該方法的對象與另一個對象相比,如果它們相等,就傳回true。預設的實作代碼會檢視其他對象參數是否引用了同一個對象(因為對象是引用類型);

  4)Equals(object, object):這個方法比較傳給他的兩個對象,看看他們是否相等。檢查時使用了Equals(object)方法,如果兩個對象都是空引用,這個方法就傳回true;

  5)ToString():傳回一個對應于對象執行個體的字元串;

  6)MemberwiseClone():通過建立一個新對象執行個體并複制成員,以複制該對象。成員指派不會得到這些成員的新執行個體。新對象的任何引用類型成員都将引用與源類相同的對象,這個方法是受保護的,隻能在類或者派生的類中使用;

  7)GetType():以System.Type的形式傳回對象的類型,利用GetType和typeof可以很友善地進行對象類型的比較;

  8)GetHashCode():在需要此參數的地方,用作對象的散列函數,它傳回一個以壓縮形式辨別對象狀态的值。

四、構造函數與析構函數

  1)在執行一個派生類的構造函數之前,必須先構造其基類,對于這個基類而言,也必須要構造這個基類的基類,直至構造至System.Object.Object()。

  2)構造函數初始化器,使用base(i)關鍵字可以指定.NET在執行個體化過程中使用基類中具有指定參數的構造函數

  3)構造函數初始化器,使用this關鍵字,這個關鍵字指定在調用指定的構造函數前,.NET的執行個體化過程對目前類使用非預設的構造函數

五、接口和抽象類

  1)相似之處:抽象類和接口都包含可以由派生類繼承的成員。接口和抽象類都不能直接執行個體化,但可以聲明這些類型的變量。如果這樣做,就可以使用多态性把繼承這兩種類型的對象指定給它們的變量。接着通過這些變量來使用這些類型的成員,但不能直接通路派生對象的其他成員。

  2)差別:派生類隻能繼承自一個基類,即隻能直接繼承自一個抽象類(但可以用一個繼承鍊包含多個抽象類)。相反,類可以使用任意多個接口。抽象類可以擁有抽象成員(沒有代碼體,且必須在派生類i中實作,否則派生類本身必須也是抽象的)和非抽象成員(它們擁有代碼體,也可以是虛拟的,這樣就可以在派生類中重寫)。另一方面,接口成員必須都在使用接口的類上實作,它們沒有代碼提。另外,按照定義,接口成員是公共的(因為它們的目的是在外部使用),但抽象類的成員可以是私有的(隻要它們不是抽象的)、受保護的、内部的或受保護的内部成員(其中受保護的内部成員隻能在應用程式的代碼或者派生類中通路)。此外、接口不能包含字段、構造函數、析構函數、靜态成員或常量。

六、結構類型

  對象是引用類型,結構是值類型。

七、淺複制和深複制

  利用基于System.Object的MemberwiseClone()方法,可以簡單地按照成員複制對象,這是一個受保護的方法,但很容易在對象上定義一個調用該方法的公共方法,這個方法提供的複制功能稱為淺度複制,因為它并沒有考慮引用類型成員。是以,新對象中的引用成員就會指向源對象中相同成員引用的對象。

  可以實作一個ICloneable接口,以标準的方式進行深度複制。如果使用這個接口,就必須實作它包含的Clone()方法

繼續閱讀