物件導向課程心得Part4

終於在這週上完最後一天的OOP課程
發文會拖到現在其實主要有兩個原因
一是目前在當兵,在部隊內是無法使用電腦
二是昨天晚上掛急診確定是A流
因為人不舒服,所有就沒有馬上發文了
這些都是題外話
今天要來跟大家聊聊事件與建構式

續上次講完委派之後
我們接下來要講Event跟建構式
相信大家都知道 Event 中文翻譯叫做事件​

事件Event
簡單來說Event相依於delegate
也就是說事件Event在C#中是個關鍵字,相依於委派
那麼沒有Event就不能使用委派嗎?
相信在前幾次的文章有提到,我使用委派也沒用到Event
ㄧ樣可以Work,至於要不要用這個Event我覺得是個人自己的決定
   public class Class1
    {
        //EventHandler 是一個委派型別
        public EventHandler XChanged  
        {
            get; set;  //使用get set 表示我可以去存取這個委派 ,這是一個沒有用Event關鍵字的方式
        }

        private void OnXChanged()
        {
            if (XChanged != null)
            { 
               XChanged.Invoke(this, new EventArgs()); 
               //委派使用Invoke();                                 
               //而這邊的參數一個是object一個是EventArgs
               //可以參考EventHandler 
            }
        }


        private int _x;
        public int X
        {
            get { return _x; }
            set
            {
                if (_x != value)
                {
                    _x = value;
                    OnXChanged(); 
                    //透過外面改變_x值,觸發set引發OnXChanged方法
                    //而就會叫用到這個委派
                    //PS:當然你要從外面註冊一個相同的委派事件給XChanged  
                    //否則XChanged還是會等於null喔!!
                }
            }
        }
 public class Class1
    {        
        public event EventHandler XChanged; //這邊就使用Event關鍵字
        private void OnXChanged()
        {
            if (XChanged != null)
            { XChanged(this, new EventArgs()); }
        }

        private int _x;
        public int X
        {
            get { return _x; }
            set
            {
                if (_x != value)
                {
                    _x = value;
                    OnXChanged();
                }
            }
        }
    }

所以其實說穿了Event就是一個比較方便的寫法

建構式Constructor
其實相信建構式我不用多講什麼
大部分的人都知道建構式在幹嘛
但是我今天要來講的是建構式的觀念!!!!

1、建構式的名稱會跟你的類別名稱相同
2、它們通常用來初始化新物件的資料成員 
3、如果你預設沒寫建構式,程式執行的時候會自動生成一個無參數的建構式(只是你不知道而已)
4、建構式不會繼承 
5、建構式如果使用Private存取修飾詞,則在該類別外部的呼叫者無法直接使用 new 運算子建立此類別的執行個體
6、千萬不要在建構是呼叫虛擬方法 (看情況)
7、new類別成立一個執行個體,並不會先去執行建構式,而是先分配記憶體(切記)
public class Person
{
   private string last;
   private string first;
   
   public Person(string lastName, string firstName)
   {
      last = lastName;
      first = firstName;
   }
   
    //這是一個最基本的範例
    //透過建構式去對Class欄位做賦值的動作
    //所以這邊使用兩個參數的建構式之後,若自己沒寫無參數的建構式
    //系統則不會再幫您產生無參數的建構式!!
}
接下來這個範例就是告訴大家不要在建構式呼叫虛擬方法
假設我寫  Truck truck = new Truck( );
就會發生下圖的執行順序


以上是事件event與建構式Constructors的基本介紹
下一篇會講擴充方法與介面
物件導向課程心得part5