C#物件導向三大特性之繼承

來源:互聯網
上載者:User

 

         繼承是指一個對象直接使用另一對象的屬性和方法。首先必須明確的一點是:繼承是類與類之間的關係(不能是類和對象)。

         那問題又來了,什麼是類,什麼又是對象呢?

         類就是對某一類具有某些相同特性的事物的抽象。而對象就是這類事物中具體的某一個事物。

         例如電腦就是一個類,而我的這台電腦就是一個對象。

        下面通過一段簡單的代碼實現一個有關繼承的例子:

        public class Person        {            public string Name            {                get;                set;            }            public int Age            {                get;                set;            }            public void SayHi()            {                Console.WriteLine("大家好!");            }        }        public class Student:Person        {            public string StuNo            {                get;                set;            }        }

 

         此時student類就有了Person類的屬性和方法和自己特有的屬性。
         為什麼要繼承?繼承帶給我們的好處?

         1、代碼重用(子類可以繼承父類的公有成員)2、可以實現多態(後面提到)

         有關繼承的幾個特性:

         1、繼承的單根性(即每個子類只能有一個父類,而一個父類則可以有多個子類)

         2、繼承的傳遞性(子類可以繼承父類的父類的共有成員)

         3、子類不能繼承父類的建構函式(預設調用父類的無參建構函式)

         所有的類都預設繼承object類(如果一個類沒有顯示的繼承一個類,則它預設繼承自object類)

         存取修飾詞:

         對於類中的成員我們可以使用5種存取修飾詞:

         private 當前類中可以訪問,類中成員的預設存取修飾詞。
         protected 當前類及子類中可以訪問。
         internal 當前程式集內部可以訪問。
         protected internal 當前程式集或子類中(相當於兩個存取修飾詞的並集)
         public 任何地方,沒有限制

         而對於類的存取修飾詞我們只能使用internal和public兩種,預設為internal。

         那麼當父類中有帶參建構函式的時候,子類該怎麼用呢?

        public class Person        {            public Person(string name, int age)            {                this.Name = name;                this.Age = age;            }            public string Name            {                get;                set;            }            public int Age            {                get;                set;            }            public void SayHi()            {                Console.WriteLine("大家好!");            }        }        public class Student:Person        {            public Student(string name,int age,string stuNo):base(name,age)            {                this.StuNo = stuNo;            }            public string StuNo            {                get;                set;            }        }

 

         當父類中有聲明了帶參建構函式時,其預設的無參建構函式將被覆蓋,此時子類在實現自己的建構函式就會報錯(因為子類預設調用父類的無參建構函式)。此時可以有兩種解決方案。第一種,在父類中手動添加無參建構函式,這時子類就可以寫自己的建構函式了;第二種,就是上面代碼中用到的,使用base調用父類的建構函式。
        由上面可知,建構函式可以重載。那麼當一個類中有多個建構函式時,我們就又可以“偷懶了”。這時我們就需要使用this關鍵字來調用本類的建構函式。

        public class Teacher        {            public Teacher()             {            }            public Teacher(string name)             {                this.Name = name;             }            public Teacher(string name, int age)                : this(name)            {                this.Age = age;            }            public Teacher(string name, int age, string sex)                : this(name, age)            {                this.Sex = sex;            }            public string Name            {                 get;                set;            }            public int Age            {                 get;                set;            }            public string Sex            {                get;                set;            }        }

 

       我們都知道子類可以繼承父類的公有成員,那麼子類可以繼承父類的私人成員嗎?

       在我們建立子類對象後,父類的私人成員也會被分配記憶體,但是子類對象不能訪問,這失去了繼承的意義。因為繼承的目的就是為了讓子類能夠訪問父類的成員(代碼重用,多態),所以我認為父類私人成員不能被子類繼承。

       下面總結幾個有關繼承中經常出現的問題:

       1、當在一個項目中引用另一個項目(程式集)之後,卻無法繼承該項目中的類,這是請檢查此類的存取修飾詞是否為internal。

       2、關於訪問性約束的問題。

           子類在繼承父類之後,子類的存取修飾詞不能比父類存取修飾詞高(可能會暴露父類的成員,使其一些特權公開)

           類似的情況還有:

              (1)類中屬性的存取層級不能比該屬性的類型的存取層級高。

              (2)方法的存取層級不能比方法的參數和傳回值的類型高。

          方便記憶的一句話:"老子"去不了的場合,"兒子"也不能去

 

        OK,有關繼承,就先說到這吧。有錯誤或是理解不到位的地方,還望大家給予批評指正。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.