定義
從概念上理解,事件就是某乙個物件向另外乙個物件傳送乙個訊息,事件的傳送方負責傳送,接收方負責接收。
詳解事件,我硬講,你是肯定不能理解的,因為事件和委託非常相似。事件其實是對委託的封裝(封裝沒忘吧?就是保護)。
委託,就是發起方明確告訴接收方,我需要什麼。然後接收方就負責去執行。
事件,就是我給你傳送乙個訊號,而這個訊號通常用來暗示你,幹什麼。
模擬兩個場景。
場景1:
傳送方:學校
發訊號:下課鈴
接收方:學生(溜了溜了!)
(接收方,表示收到並且欣然接受)
場景2傳送方:女朋友板著個臉
發訊號:"哼"
接收方:怕是有事,但是不知道是什麼事。你慌不慌?
(接收方,表示心慌,並希望離開這裡!)
場景1很簡單,就是明面上,大家約定俗成的一種訊號,當接收方接收到訊號的時候,明確的知道自己要幹什麼,並做出與之對應的行為。
場景2也很簡單,這個事件不是你觸發,也不在約定範圍。但是你做為接收方,你接收到了。
舉例宣告事件的關鍵字是event
public event eventnameeventhandler eventname
因為事件是對委託的封裝,所以事件在宣告時,需要關聯乙個委託。例子**中的eventnameeventhandler就是事件與委託關聯時的一種約定命名,要求必須是事件名字(eventname) + 固定文字(eventhandler),最後定義事件的名稱。
我們用場景2來舉例子,首先你要定義乙個女朋友類
girlfriend類裡面有乙個委託和乙個事件。用於事件的委託,需要注意的是,在定義時,一定是沒有返回值的(void)。其次,必須包含兩個引數,第乙個引數object型別通常命名為e,用於指定引發事件的物件。第二個引數為eventargs型別,用於傳遞事件所需要的資料。public class girlfriend
注意委託的命名,前面有講過規則。
然後我們例項化乙個女朋友,並使用 "+=" 來繫結事件。(此處**另有乾坤,看後面的兩幅圖)
注意,在輸入完"+="符號後會出現智慧型提示,只需要按下tab鍵,會自動幫你生成事件與之對應的方法。static void main(string args)
紅框內的是自動生成的
生成出來以後,記得修改生成方法中**。。。
編碼到這裡,其實已經完成了對事件的定義,以及事件的註冊("+="符號做的就是註冊)。但是你執行你會發現,事件並沒有被觸發。
接下來,我們要做的事情,就是惹"她"生氣。 誒~,刺不刺激?
(!=)乙個感嘆號,乙個等號,是邏輯運算子,不等於的意思。等號很好理解。感嘆號是邏輯運算子'非'的意思("這裡的非和古語中的'非也非也'作用一樣"),就是取反,那麼原本的等於,加上感嘆號以後就變成了不等於。public class girlfriend
}
}
然後就是呼叫事件,在呼叫定義的事件時,要求傳入的引數,就是與事件關聯的委託中定義的引數,第乙個引數傳入this。這裡的this代表是自己,即當前物件本身。後面的第二個引數,因為沒有,就new乙個與之引數型別一樣的物件即可。
全部定義完成以後,我們要讓她生氣!
最終如願以償輸出了 "哼"static void main(string args)
總結上述例子,如果你覆盤全部**的話,會有一種,不過是乙個方法呼叫另外乙個方法感覺,但是事件的呼叫在真實的業務場景中,大多數是由類本身去觸發,只要你註冊了這個事件,你就是事件的接收者,你需要針對該事件去做出響應。
其實這個例子並不是乙個能體現事件結構的例子。我只是用了一種最普通的結構來呈現事件。
C 中級 多型
基本概念 include include using namespace std 抽象類,無法例項化物件。class animal class dog public animal class pig public animal 1.在編譯階段,已確定函式位址為animal了。在執行階段,因為有了vi...
C 中級 多型
基本概念 include include using namespace std 抽象類,無法例項化物件。class animal class dog public animal class pig public animal 1.在編譯階段,已確定函式位址為animal了。在執行階段,因為有了vi...
C 中級 繼承
基本語法 include include using namespace std 語法 子類類名 public 父類類名 class animal void walk string args class dog public animal string name class cat public a...