另一種思考事件,發佈者/訂閱者等的方式是思考雲及其運作方式。在基於雲的系統中,任何實體都可以註冊以偵聽任何類型的事件,或者可以發佈任何它想要的事件。任何人在傾聽,都會得到這些數據。
在您的示例中:出租車中央可以發佈/推送事件,如輪班更改,交通事故(位置),出租車請求(位置)或其他類似的事情,整個出租車組將會聽。個人出租車將出版諸如Pickup At(Location),Drop Off(Location),Accident at(Location);中央將爲自己的目的登錄。其他出租車可以,如果他們還想要聽這些相同的事件,以便他們知道在哪裏和如何接近其他出租車到他們自己的位置,或者如果有另一個駕駛室報告或類似的事故。
但云事件是事件系統的特定實現。它更常見於特別訂閱事件。駕駛室對象在創建時會立即訂閱中央事件,而派遣駕駛室時的中央系統將確保它自己訂閱該出租車的事件。
這樣,兩個對象都起到發佈者和訂閱者的作用。它只針對單個事件。在我的示例中,PickupAt(Location)
將由出租車發佈,並由Central訂閱。因此,對於那個事件,Cab是發佈者,並且Central是訂閱者。一般來說,誰擔任什麼角色完全取決於系統設計和正在創建的事件。它並不是真正可以推廣的東西,因爲如果你設置不同的事件,整個設置可能會改變,甚至會顛倒過來。我認爲這是最重要的部分。
代表作爲一個整體
在其最簡單的術語,代表是一種參考。它可以引用一個類,更常見的是它可以引用類中的方法,或者調用類中的方法。它甚至可以包含整個方法調用。它的確是一個非常多功能的對象,因爲它可以做很多事情。在事件的上下文中,委託實際引用對實現該事件的函數的調用。
public class c1
{
public event Eventhandler DoStuff;
public c1()
{
}
public void OnDoStuff()
{//this actually makes the event happen
if (DoStuff != null)
DoStuff(this, null);
}
}
public static void Main()
{
c1 x = new c1();
x.DoStuff += new EventHandler(ThingFunction);
x.OnDoStuff();//this is how you would fire the event deliberately
}
public void ThingFunction(object sender, EventArgs x)
{
Console.WriteLine("Something Happened");
}
C1包含事件DoStuff
簡單事件代碼,主要支持這一活動。當代碼從任何地方調用x.OnDoStuff()
時,如果您將x或其引用傳遞到實際代碼被處理的其他類中,這非常方便,然後處理程序返回主程序,無論調用x.OnDoStuff()
多少層起源於,將執行。
確切地說,一旦創建了X,它就可以被傳遞到其他地方。只要某些功能分配給x.DoStuff
,無論您何時何地調用方法x.OnDoStuff()
,都將執行分配給x.DoStuff
的功能。這就是事件訂閱的工作方式。 x.OnDoStuff()
是發佈事件x.DoStuff
的代碼調用,以及任何類...實際上任何數量的類,你都可以擁有多個訂閱者,將能夠捕獲已發佈的事件。
感謝您的解釋!我想如果我還必須使用WPF窗口,它會更加複雜。出租車中央是主窗口,所有的出租車都有用於說明目的的用戶窗口。那麼我必須在小步驟中完成 – 2012-08-08 16:43:39
在我的指導中,我將定義三個EventArgs信息類,它們是從EventArgs派生的?我不確定那是什麼意思?從EventArgs派生的部分? – 2012-08-08 16:56:50
是這個家庭作業?如果是這樣,請添加作業標籤。您似乎有一組相當具體的要求... EventArgs是EventHander用來將參數傳遞到訂閱者函數的通用類。通過創建該類的自定義實現,您可以讓事件發佈比「DoStuff」更多的特定數據。您可以在「OnDoStuff」發佈呼叫中填充此數據。 – Nevyn 2012-08-08 17:03:41