天天看點

C#基礎篇--靜态成員、抽象成員、接口

1.靜态成員:  

  靜态成員(static)、靜态類與執行個體成員、類:

  靜态成員屬于類所有,非靜态成員屬于類的執行個體所有。

  靜态成員不能标記為 Virtual,Abstract,Override,也就是說靜态成員不能實作多态。

  靜态成員建立後始終使用同一塊記憶體(靜态存儲區),而使用執行個體成員的方式會建立多個記憶體。

  靜态類中隻能聲明靜态方法和靜态字段,靜态方法隻能通路靜态成員變量。

  由于靜态成員是在整個程式退出時,才釋放資源,是以盡量避免寫靜态字段或靜态屬性,最好隻寫靜态方法。

  當一個普通的類中有靜态成員時,系統會預設添加一個靜态的構造函數。

  靜态的構造函數,隻會在第一次使用靜态成員之前執行。并隻執行一次,不管以後是否多次使用靜态成員。

  靜态構造函數就是在該類名前加一個Static。

  靜态的構造函數不能有通路修飾符、并且也不能帶參數。

  靜态成員就相當于Abstract和Sealed的結合體。

    靜态類不能被繼承,靜态類不能實作任何接口。 

  什麼時候使用靜态成員?

    當多個對象共享同一個資料的時候就可以在執行個體類中加入靜态成員。

  什麼時候使用靜态類?

         1.當這個類是一個工具類,裡面都是方法,為了讓使用者調用的時候友善。(例如:系統中的convert、Math就是靜态成員)

         2.模拟“全局變量”的時候。例如:人類,每個人都是一個對象。而所有的人都居住在同一個星球----地球上

2.簡單的介紹一下密封成員(Sealed)

  密封類(sealed) ,是不能被繼承的,密封方法。

  在一個子類的重寫方法前加上sealed關鍵字,這樣這個方法以後就不能再重寫了。

  什麼時候用密封類?

  1.像String類,在.net系統中本身對字元串有很多特殊處理,為了防止别的類繼承後造成混亂。

  2.關于一些商業的問題,不想讓别人知道你内部的資訊。

3.抽象成員

  抽象成員與抽象類:

  1. 抽象方法不能有任何方法體。用Abstract來标記。
  2. 抽象成員必須包含在抽象類中,不能寫在一個執行個體類中。
  3. 父類中的抽象成員,子類繼承必須重寫,除非子類也是抽象類。
  4. 抽象類是不能被執行個體化的。
  5. 抽象成員通路修飾符不能是Private.
  6. 抽象類中可以包含執行個體成員。是以抽象類中有構造函數,雖然不能執行個體化。
  7. 抽象類就是為了讓子類繼承。(來實作多态),它定義的就是公共的實作和能力。
  8. 抽象方法不能用Static來修飾。 
  9. 抽象類可以用來實作接口

  抽象方法與虛方法使用時的差別:

  1. 如果父類中的方法有預設的實作,并且父類需要被執行個體化,這時可以考慮将父類定義成一個普通類,用虛方法來實作多态。
  2. 如果父類中的方法沒有預設實作,父類也不需要被執行個體化,則可以将該類定義為抽象類。 

  注意:   

    1.抽象屬性雖然與自然屬性一樣的寫法,但不是同一種東東,抽象的屬性必須在子類中重寫。屬性、索引器也是另一種方法的表現形态

    2.如果子類中某一個方法與父類中某一個方法相同,如果不是用Override重寫的,那麼就要在前面加一個new,表示在子類中寫了一個全新的方法,與父類沒有關系。

4.接口(Interface)  

         定義:接口就是統一的規範,以I開頭命名,以Able作結尾。 

  接口的使用:

  1. 接口中隻能包含方法(方法、屬性、索引器、事件),并且方法中不能有任何方法實作。是以接口中沒有構造函數,并且不能被執行個體化。
  2. 接口中的成員不能有任何的通路修飾符,預設是Public。
  3. 當一個類同時繼承了某個類,并且也實作了一個或多個接口時候,必須把繼承的類寫在第一個位置。
  4. 實作接口的類,必須實作接口中的所有成員,抽象類也可以實作接口。
  5. 類與接口是實作關系,而不是繼承,因為接口就是規範。可以把接口了解成類的父類。
  6. 接口與接口之間也是可以有(繼承)的關系的
  7. 在實作接口的時候可以把接口中的方法修改為Virtual或Abstract. 

  建議:在接口中不要寫太多的方法。可以把多個方法分别寫到各個接口中,要避免接口的污染。(例如:古代的活字印刷術有些相似)。 

  注意:  

        1.在計算機中就算類中已經把接口的那些規範都實作了,但沒有繼承接口,這樣是錯的,因為在計算機中必須實作接口,才能保證實作了這些規範。

    2.在擴充原功能要修改原檔案,修改原檔案就會看到原代碼,是以在寫程式的時候要注意不要出現這個問題,要把變化的東東封裝起來。我們要面向父類、面向接口程式設計。

    3.能夠寫執行個體成員的類中一定就會有構造函數。 

  接口的好處:

  1. 解決了類的多繼承的問題。
  2. 解決了類繼承以後體積龐大的問題。 

  顯示實作接口:

  1. 通路修飾符是Private.(根據反編譯得到的)目地就是防止類來調用。
  2. 隻有用接口才能調用。
  3. 接口名.方法名();并且沒有通路修飾符。
  4. 并且能更好的解決方法重名的問題。

每一天都是嶄新的,我們的目标有多遠,我們就能走多遠,堅持!!

繼續閱讀