1. 程式人生 > >C#物件的三個特點:封裝,繼承,多型, 以及c#中隱藏(new)和方法重寫(override)和過載(overload)的區別

C#物件的三個特點:封裝,繼承,多型, 以及c#中隱藏(new)和方法重寫(override)和過載(overload)的區別

封裝

1)封裝原則:將不需要對外提供的內容都隱藏起來,把屬性都隱藏,提供公共方法對其訪問,通常有兩種訪問方式:set 設定,get 獲取。

2)封裝結果:存在但是不可見。

3) 訪問修飾符

宣告的可訪問性                                 含義

public                                    訪問不受限制。

protected                              訪問僅限於本類或者其子類(可以跨程式集)。

private                                  訪問僅限於本類。

internal                                 訪問僅限於當前程式集。

protected  internal                 本類或者同一個程式集或者子類(可以跨程式集)裡面訪問

注意:對欄位和方法而言  預設是私有的  但是對類而言 預設是internal

4)封裝:是把類的內部隱藏起來,以防止外部世界看見的一個面向物件的概念

5) 重構(這裡大家多多補充

class Class1

    {

        private int i = 1;

        public int I

        {

            get { return i; }  //只允許外部類讀取屬性

            set { i = value; } //只允許外部類寫入屬性

        }

    }

繼承

父子概念的繼承:圓繼承於圖形,圓是子概念(子型別 Sub class)圖形是父型別(Super Class也叫超類),繼承在語法方面的好處:子類共享了父類的屬性和方法的定義,子類複用了父類的屬性和方法,節省了程式碼。

繼承是is a :“是”我中的一種,一種所屬關係。

子型別物件可以賦值給父型別變數(多型的一種形式),變數是代詞,父型別代詞可以引用子型別東西。

(1) 被繼承的類稱為基類或父類,而繼承得到的類稱為子類或派生類。子類繼承超類的狀態和行為,同時也可以具有自己的特徵。

(2) 所有的型別的基類是System.Object類

(3) class A : B

(4) A:B  B:C 則 A:C

(5) 建構函式不能被繼承

(6) 一個子類只能繼承與一個父類

(7) 使用sealed關鍵字,其他類無法繼承此類

(8) 子類不光繼承父類的公有成員,同時繼承了父類的私有成員,只是在子類中不被訪問。

特點:

 c#中隱藏(new)和方法重寫(override)和過載(overload)的區別

過載、重寫和隱藏的定義:

過載:同一個作用域內發生(比如一個類裡面),定義一系列同名方法,但是方法的引數列表不同。這樣才能通過傳遞不同的引數來決定到底呼叫哪一個。而返回值型別不同是不能構成過載的。

重寫:繼承時發生,在子類中重新定義父類中的方法,子類中的方法和父類的方法是一樣的 
        例如:基類方法宣告為virtual(虛方法),派生類中使用override申明此方法的重寫.

隱藏:基類方法不做申明(預設為非虛方法),在派生類中使用new宣告此方法的隱藏。

過載時,根據引數選擇呼叫的方法;
重寫時,訪問父類子類皆呼叫子類的重寫方法;
隱藏時,訪問父類則呼叫父類的方法,子類子類的方法。

隱藏(new)示例:

using    System;  
   class    A  
   {  
         public    void    F()    
         {  
               Console.WriteLine("A.F");    
         }  
   }  
   class    B:    A  
   {  
         new    public    void    F()    
         {    
               Console.WriteLine("B.F");    
         }  
   }  
   class    Test  
   {  
         static void Main(string[] args)
         {  
               B    b    =    new    B();  
               b.F();  
               A    a    =    b;    
               a.F();  
         }  
   }  
   輸出為  
   B.F  
   A.F  

重寫virtual(虛方法)示例  
   using    System;  
   class    A  
   {  
         public    virtual    void    F()    
         {  
               Console.WriteLine("A.F");    
         }  
   }  
   class    B:    A  
   {  
         public    override    void    F()    
         {    
               Console.WriteLine("B.F");    
         }  
   }  
   class    Test  
   {  
         static    void    Main()    
         {  
               B    b    =    new    B();  
               b.F();  
               A    a    =    b;    
               a.F();  
         }  
   }  
   輸出為  
   B.F  
   B.F

補充:重寫override一般用於介面實現和繼承類的方法改寫,要注意

   1、覆蓋的方法的標誌必須要和被覆蓋的方法的標誌完全匹配,才能達到覆蓋的效果;
   2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
   3、覆蓋的方法所丟擲的異常必須和被覆蓋方法的所丟擲的異常一致,或者是其子類;
   4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,並沒有對其進行覆蓋。

多型

1)繼承體現了多型:父型別變數可以引用各種各樣的子型別例項,也可接收子類物件。

2)個體的多型:父型別的子型別例項是多種多樣的。

行為的多型:父型別定義方法被子類重寫為多種多樣的,過載也是多型的方法。

千萬不能出現將父類物件轉成子類型別,會造型異常!

3)多型前提:必須是類與類之間有關係。要麼繼承,要麼實現。通常還有一個前提:存在覆蓋。

4)多型的好處:多型的出現大大的提高程式的擴充套件性。

多型的弊端:雖然提高了擴充套件性,但是隻能使用父類的引用訪問父類中的成員。

5)在多型中成員函式的特點:

①在編譯時期:參閱引用型變數所屬的類中是否有呼叫的方法。如果有,編譯通過,如果沒有編譯失敗。

②在執行時期:參閱物件所屬的類中是否有呼叫的方法。

③簡單總結就是:成員方法在多型呼叫時,編譯看左邊,執行看右邊。

6)在多型中,成員變數的特點:無論編譯和執行,都參考左邊(引用型變數所屬的類)。

7)在多型中,靜態成員方法和屬性的特點:無論編譯和執行,都參考做左邊。

8)父類引用指向子類物件,當父類想使用子類中特有屬性、方法時,要向下轉型。