第9講事件1
現在來講一下事件。我們知道windows作業系統是乙個基於事件的作業系統。掌握事件的機制對gui程式設計能有著非常重要的意義。
事件是類在發生其關注的事情時來提供通知的一種方式。例如,封裝使用者介面控制項的類可以定義乙個在使用者單擊該控制項時發生的事件。控制項類不關心單擊按鈕時發生了什麼,但它需要告知派生類單擊事件已發生。然後,派生類可選擇如何響應。
說到事件,就得談談2個角色
事件發行者(publisher):
乙個事件發行者,也稱作傳送者(sender),其實就是乙個物件,這個物件會自行維護本身的狀態資訊。當本身狀態資訊變動時,便觸發乙個事件,並通知所有的事件訂閱者。
事件訂閱者(subscriber)
對事件感興趣的物件,也稱為接收者(receiver),可以註冊感興趣的事件,通常需提供乙個事件處理程式,在事件發行者觸發乙個事件後,會自動執行這段**的內容。
下面我們舉乙個簡單的例子來說明事件,如圖:
好,下面我們來用**來實現出版社和訂戶之間的故事。
using system;
//定義乙個類publisher,就是出版社
class publisher //出版社 }
} //出版社已經建成了,但是出版社要生存就必須要有使用者去訂閱它的雜誌,否則出版社的存在就失去了意義
//下面我們來建立乙個訂閱者的類
//宣告乙個訂閱者的類
class subcriber //訂閱者
//以上的receive方法要注意事件處理程式中所定義的方法必須跟委託型別一一對應
//也就是publish委託是乙個沒有返回值沒有引數的委託型別,而你所定義的方法receive也必須是沒有返回值沒有引數的
//這一點在上一次課的委託中我們已經講到
} //好,出版社有了訂閱者也有了,我們就可以開始演藝他們之間的故事了
class story }
我們看下效果,如圖:
using system;
class publisher //出版社 }
//宣告發行生活雜誌所需要的方法
public
void issuelife() }
} class subcriber //訂閱者
//由於在委託中,委託型別中帶了個字串引數,所以receive也必須要帶乙個字串引數
public
void receive(string magazinename) }
//演藝他們之間的故事
class story }
我們來看執行的效果,如圖:
從這裡我們可以看出,事件發行者只會把事件傳送給那些訂了該事件的使用者,如果有多個使用者訂閱了同乙個事件,那麼該事件觸發時,它就會把訊息傳送給多個使用者。
通過這個例子我們可以感受到一點點事件給我們帶來的好處,也讓我們進一步了解了事件的機制。
c 學習筆記九
程式檔案和預處理指令 1 程式檔案 標頭檔案 型別定義和其他用於程式中乙個或多個原始檔的 字尾名為 h 原始檔 要編譯成機器指令的 字尾名為 cpp c cxx 引入標頭檔案 格式如下 include 名稱的作用域 程式檔案的連鏈結 確定名稱的鏈結屬性 內部鏈結屬性 可以在同乙個轉換單元的任何地方訪...
C 學習筆記(九)陣列
c 中的陣列 int array 元素型別 陣列名空間大小 int array new int 10 相當於new了乙個陣列,賦值給array 初始化陣列,給陣列賦值 double doublearray new double 10 給某個元素賦值 doublearray 0 100.00 快捷構造...
c語言學習筆記九
運算子 邏輯運算 xor 的真值表 a b a xor b 0 0 0 0 1 1 1 0 1 1 1 0 nand 的真值表 a b a nand b 0 0 1 0 1 1 1 0 1 1 1 0 nor 的真值表 a b a nor b 0 0 1 0 1 0 1 0 0 1 1 0 進製間的...