天天看點

面向對象——繼承與構造函數

繼承的概念:讓派生類(子類)擁有基類(父類)所有的功能。

實作:通過在派生類後加 “:”冒号,實作繼承。好處:增加了代碼的重用性。

如果一個類沒有顯示定義其父類,那麼他的父類是System.Object,隻能有一個基類。

建立派生類對象的時候,預設的情況的下,在派生類通過調用基類的預設構造(通路修飾符是public,并且沒有任何的形參)函數來建立基類對象的。如果基類沒有預設的構造,則需要在派生類中顯示調用基類的構造函數。

方式:派生類構造函數():base(實參)

{}

構造函數:類構造函數,對象構造函數,派生類調用基類的構造函數。構造函數的作用:初始化字段,給字段指派。

靜态構造函數:靜态構造函數不能有通路修飾符,必須是靜态的。

靜态構造函數不能有任何參數。靜态構造函數有且僅有一個構造函數。靜态構造函數隻執行一次,調入記憶體後就不再執行。

例:

  Public class Person

             {

        Static Person(){}

}

Static的作用:在記憶體中建立類的實體。

注:沒有指定基類,則基類預設為object

防止繼承—密封類,關鍵字(sealed),該類就不能作為其他類的基類。  

例:給飯卡充錢:

   public class Peson

   {

       private ushort height;//字段

       public ushort Height

       {

           get

           {

               Console.WriteLine("調用Get方法");

               return height;

           }

           set

               Console.WriteLine("調用Set方法");

               height = value;

       }

       private string name;

       private byte age;

   }

   public class Card

       private string owner;

       public string Owner

           get { return owner; }

           set { owner = value; }

       private decimal balance;

       public decimal Balance

           get { return balance; }

           set { balance = value; }

   public class Teacher : Peson

       public void FullMoney(Card card, decimal money)

           card.Balance += money;

   public class Student : Peson

       private Card myCard;

       public Card MyCard

           get { return myCard; }

           set { myCard = value; }

   class Program

       static void Main(string[] args)

           Student s = new Student();

           s.Height = 15;

           Console.WriteLine(s.Height);

           Card card = new Card();

           s.MyCard = card;

           Teacher t = new Teacher();

           t.FullMoney(card, 100);

           Console.WriteLine(s.MyCard.Balance);

輸出結果:

     調用Set方法

     調用Get方法

     15

     100

派生類調用基類的方法:1、如果派生類中沒有基類的方法,可以直接調用該方法。

2、派生類中有該方法應該用base.方法名調用

例:public class CustomerAccount

       public virtual decimal CalculatePrice()

           return 0.0m;

   class GoldAccount : CustomerAccount

       public override decimal CalculatePrice()

           return base.CalculatePrice()*0.9m;

構造函數舉例:

1、public class Student

       public Student()

           Console.WriteLine("調用構造函數");

           Student st = new Student();

輸出結果:調用構造函數

例2、在繼承中,建立對象的執行過程。

 public class Person

       public Person()

           Console.WriteLine("Peson");

       public Person(string name)

           Console.WriteLine("Name:"+name);

   public class Student:Person

           : base()//當為無參時,可有可無,系統會自動添加

       public Student(string name)

           : base()//當基類有多個構造函數時,base用來指定調用的構造函數

           Console.WriteLine("調用構造函數:姓名:"+name);

       public Student(string name, int age)

           : base(name)//調用 Person(string name)構造函數

           Console.WriteLine("調用構造函數:姓名:" + name+" 年齡:"+age);

         Student st = new Student();

         Student st1 = new Student("xiaowang");

         Student st2 = new Student("xiaowang",12);

 Peson

 調用構造函數

Peson

調用構造函數:姓名:xiaowang

調用構造函數:姓名:xiaowang 年齡:12