C#基礎知識整理:基礎知識(4) 繼承

來源:互聯網
上載者:User
前面提到過,物件導向的三大特性:封裝性、繼承性和多態性。封裝在前面類的定義裡也瞭解的差不多透徹了,現在看看繼承的特性。
繼承實際是一個類對另一個類的擴充,後者稱之為基類,前者稱之為子類。繼承就是子類擁有基類的一切屬性和方法,子類還可以增加屬性和方法。但是子類不能去掉父類的屬性和方法。
當然這裡還要提到修飾符的問題,子類擁有基類的所有屬性和方法,不意味著子類可以任意訪問繼承的這些屬性和方法。子類只能訪問到public和protected修飾的屬性和方法,其餘無法直接存取。還有一個就是static的屬性和方法是不能被繼承下來的,因為靜態類型之和類有關係與對象無關。
看代碼:

using System;namespace YYS.CSharpStudy.MainConsole{    public class YSchool    {        private int id = 0;        private string name = string.Empty;        public int ID        {            get            {                return this.id;            }        }        public string Name        {            get            {                return name;            }        }       /// <summary>       /// 構造器       /// </summary>        public YSchool()        {            this.id = 0;            this.name = @"清華大學附中";        }        /// <summary>        /// 構造器        /// </summary>        public  YSchool(int id, string name)        {            this.id = id;            this.name = name;        }        /// <summary>        /// 構造器        /// </summary>        public  YSchool(int id)        {            this.id = id;            this.name = @"陝師大附中";        }    }    public class YTeacher    {        private int id = 0;        private string name = string.Empty;        private YSchool school = null;        private string introDuction = string.Empty;        private string imagePath = string.Empty;        /// <summary>        /// 使用唯讀屬性,因為是固有屬性。        /// </summary>        public int ID        {            get            {                return id;            }        }        public string Name        {            get            {                return name;            }        }        /// <summary>        /// 這幾個使用get/set屬性,因為這幾個屬性不是固有的,可以隨著某些條件改變的。        /// </summary>        public YSchool School        {            get            {                if (school == null)                {                    school = new YSchool();                }                return school;            }            set            {                school = value;            }        }        public string IntroDuction        {            get            {                return introDuction;            }            set            {                introDuction = value;            }        }        public string ImagePath        {            get            {                return imagePath;            }            set            {                imagePath = value;            }        }        public YTeacher(int id, string name)        {            this.id = id;            this.name = name;        }        /// <summary>        /// 給學生講課的方法        /// </summary>        public void ToTeachStudents()        {            Console.WriteLine(string.Format(@"{0} 老師教育同學們: Good Good Study,Day Day Up!", this.name));        }        /// <summary>        /// 懲罰犯錯誤學生的方法        /// </summary>        /// <param name="punishmentContent"></param>        public void PunishmentStudents(string punishmentContent)        {            Console.WriteLine(string.Format(@"{0} 的{1} 老師讓犯錯誤的學生 {2}。", this.School.Name, this.name, punishmentContent));        }    }    /// <summary>    /// 男性老師,繼承自YTeacher    /// </summary>    public class MrTeacher : YTeacher    {        /// <summary>        /// 構造器,這裡要注意,YTeacher是沒有提供預設構造器的,        /// 所以子類必須要有構造器,並且和基類參數列表一致。        /// </summary>        /// <param name="id"></param>        /// <param name="name"></param>        public MrTeacher(int id, string name)            : base(id, name)        {        }        /// <summary>        /// 擴充的方法,刮鬍子方法。        /// </summary>        public void Shave()        {            Console.WriteLine(string.Format(@"{0} 老師用飛科剃鬚刀刮鬍子。",this.Name));        }    }    /// <summary>    /// 女性老師,繼承自YTeacher    /// </summary>    public class MisTeacher : YTeacher    {        /// <summary>        /// 建構函式        /// </summary>        /// <param name="id"></param>        /// <param name="name"></param>        public MisTeacher(int id, string name)            : base(id, name)        {        }        /// <summary>        /// 擴充方法,護膚的方法        /// </summary>        public void SkinCare()        {            Console.WriteLine(string.Format(@"{0} 老師用香奈兒護膚霜護膚。",this.Name));        }    }}
using System;namespace YYS.CSharpStudy.MainConsole{        class Program    {        static void Main(string[] args)        {            MrTeacher mrTeacher = new MrTeacher(1, @"牛轟轟");            mrTeacher.ToTeachStudents();            mrTeacher.PunishmentStudents(@"背唐詩");            mrTeacher.Shave();            MisTeacher misTeacher = new MisTeacher(2, @"郝漂靚");            misTeacher.ToTeachStudents();            misTeacher.PunishmentStudents(@"默寫紅樓夢");            misTeacher.SkinCare();            Console.ReadKey();        }    }

結果:

繼承是物件導向的特性,它的好處是:
第一、做項目設計類時,繼承可以讓我們省略量代碼;
第二、符合物件導向中類的組織形式,在C#、java等進階物件導向語言中,都有一個object類,這是所有類的祖宗類,其他類都有他派生而來。
繼承需要注意一點,就是子類的構造器問題。程式運行過程是子類首先調用父類的構造器。如果子類沒有寫構造器,那麼就會調用父類的預設構造器。如果父類沒有預設的構造器,即父類寫了帶參數的構造器,那麼子類也就調用帶參數的那個構造器,不過需要指明是調用的哪個帶參數的構造器(見代碼中base)。
以上就是C#基礎知識整理:基礎知識(4) 繼承的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

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