c#重點[封裝,繼承,多肽]

來源:互聯網
上載者:User

標籤:

物件導向的語言三大特點:封裝、繼承、多態

Ⅰ.封裝:是把類的內部隱藏起來,以防止外部世界看見的一個物件導向的概念,通過關鍵字去控制變數,方法的存取權限。

  1).存取修飾詞:

     

Ⅱ.繼承:

   eg:我們建一個Person作為父類,Chinese作為子類

 1 class Person 2     { 3         public string name="zhangsan"; 4         public int age=21; 5         //類裡面有一個預設的構造方法,我們在下面寫了一個構造方法,如果想去調用這個無參數的構造方法,那就要加一個無參構造方法 6         public Person() 7         { 8             Console.WriteLine("我是一個人類"); 9         }10         public void SayHi()11         {12             Console.WriteLine("hello,我是人類!");13         }14     }
Person
1  class Chinese:Person2     {3 4     }
Chinese

我們在程式入口裡面調用父類裡面的成員:

class Program    {        static void Main(string[] args)        {            Chinese c = new Chinese();            Console.WriteLine(c.name);            Console.WriteLine(c.age);            c.SayHi();        }    }
Program

   得到結果為:

     

   1.為什麼子類裡面沒有成員,還能調用?

   如果,我把person裡面的 [public string name="zhangsan";]變為私人成員[private string name;],調用結果顯示?

   

   以上的得出結論:

  繼承:

  1.單繼承,一個類只能繼承一個類[一個兒子只有一個爹]
  2.Chinese:Person Chinese 子類/衍生類別 Person 父類/基類/超類
  3.Chinese:Person 那麼Chinese繼承了Person裡面所有的成員(欄位、方法),對於父類的私人成員,子類還是能繼承到,只是沒有存取權限

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

 3) . 建構函式不能被繼承

 4).子類Chinese裡面添加一個方法

1     class Chinese:Person2     {3         public Chinese()4         {5             Console.WriteLine("我是中國人!");6         }7     }
Chinese 

  我們調用program看一下結果:

 class Program    {        static void Main(string[] args)        {            Chinese c = new Chinese();            c.SayHi();        }    }
Program 

  結果顯示:

     

   4.當執行個體化子類對象時,首先調用父類的構造方法,然後調用子類的構造方法。

 5).人類屬於動物類animal,我們建立一個animal類讓rerson類繼承。chinese繼承person,person繼承animal

class Animal    {        public Animal()        {            Console.WriteLine("我是動物類!");        }    }
Animal
 class Person:Animal    {        public Person()        {            Console.WriteLine("我是人類");        }        public  void SayHi()        {            Console.WriteLine("hello,我是人類!");        }
Person:Anima 
    class Chinese:Person    {        public Chinese()        {            Console.WriteLine("我是中國人!");        }    }
Chinese:Person

   結果顯示:

     

   5.如果A:B,B:C,那麼A:C;

 6).父類Person裡面有一個SayHi()方法,如果在子類裡面添加一個sayHi方法

class Chinese:Person    {        public Chinese()        {            Console.WriteLine("我是中國人!");        }        public void SayHi()        {            Console.WriteLine("你好,我是中國人");        }    }
Chinese裡添加一個SayHi方法

     結果顯示:

       

    我們來談一下過程:

    ⅰ.繼承過來之後被隱藏,有意隱藏加一個關鍵字"new",如果加了關鍵字"new",就告訴子類,父類裡面的sayHi只能被隱藏,不能被覆寫

     

    ⅱ.繼承過來之後被覆寫/重寫,覆寫需要在父類裡面加"virtual",加了"virtual"之後就告訴子類繼承之後,子類只能覆寫"override"

          

     結果還是一樣,結論顯示:

     6.一個子類和父類有相同的方法時,當運用子類的對象去調用該方法時,調用子類的方法,預設情況下,從父類的方法被隱藏掉,(有意隱藏,需要在子類的方法上加上New(可以加也可以不加))

  如果想覆寫/重寫父類的方法,需要在父類裡面設定該方法為虛方法(virtual),然後子類通過override關鍵字去覆寫。

   7).裡氏替換原則:一個父類的變數可以接收子類的對象,反之不行。

class Person:Animal    {        public Person()        {            Console.WriteLine("我是人類");        }        public  void SayHi()        {            Console.WriteLine("hello,我是人類!");        }    }
Person
class Chinese:Person    {        public Chinese()        {            Console.WriteLine("我是中國人!");        }        public  void SayHi()        {            Console.WriteLine("你好,我是中國人");        }    }
Chinese:Person
 class Program    {        static void Main(string[] args)        {            //父類的變數可以接收到子類的任何類型            //如果沒有覆寫的話,就近原則,p離person近,就調用person的sayHi方法            Person p = new Chinese();            p.SayHi();            Console.ReadKey();        }    }
Program

   結果:

           

   覆寫之後: 

class Person:Animal    {        public Person()        {            Console.WriteLine("我是人類");        }        public virtual void SayHi()        {            Console.WriteLine("hello,我是人類!");        }    }
Person 
class Chinese:Person    {        public Chinese()        {            Console.WriteLine("我是中國人!");        }        public  override void SayHi()        {            Console.WriteLine("你好,我是中國人");        }    }
Chinese

   結果:

         

     得出:

         7.子類和父類有相同的方法,預設情況下(沒有被覆寫),該變數調用該方法時,調用的是父類的方法(就近原則);

        當子類覆寫該方法時,變數調用的是子類的方法。

  8) .密封類 sealed class,不能被繼承的類

           

  9).繼承的好處?

      假設工廠要生產三孔的插座,它首先會把模型設計出來,模型裡面只是定義了方法,模型沒有寫方法的具體內容,把公用的方法抽象出來,做程式的時候先寫了一個介面,

    讓下面的類繼承這個介面,這個介面並不實現具體的內容,只是定義方法名,返回的類型,具體實現什麼效果是在子類裡面override,所以繼承的好處就是把公用的東西抽象出       來,減少了代碼的重複性。

 

Ⅲ.多態 方法名相同,方法具體實現內容不同

  1. 多態分為重載(overload)和覆寫(override)

      重載:方法名相同,方法裡面的參數不同,參數的種類,個數或者順序不同。

  2. 只有父類的虛方法(virtual)才能被子類覆寫,子類實現覆寫用關鍵字override,如果不加override就隱藏了父類的方法(需要加上關鍵字new,eg: public new static void Chinese())

  3. 靜態方法不能被覆寫,但可以被隱藏

  4. 靜態類裡面只能有靜態成員

  5. 靜態成員不能帶override ,virtual ,abstract

c#重點[封裝,繼承,多肽]

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.