2012-08-08 91 views
2

我正在阅读和阅读,但我仍然无法理解观点,以及如何使用代表/活动和发布者/订户?我知道委托是一个包含一个或多个方法引用的类,并且它用于将方法发送到另一个方法。与代表/活动和发布者/订阅者不理解观点

我不明白的是我应该如何确定publischer/suubscriber的角色。我们举个例子吧。 taxitntral和它的出租车。 taxisntral是发布者和出租车的用户,是否正在从taxitntral获得驾驶订单?但出租车也可能是出版商,并向那里报告他们前往taxitntral的位置和地址,然后是出租车的用户!?

我需要灵感,我正在寻找som初学者代码来了解这是如何工作的。是否有人有几分钟的时间用一些简单的代码来回答这个问题?谢谢!

回答

2

另一种思考事件,发布者/订阅者等的方式是思考云及其运作方式。在基于云的系统中,任何实体都可以注册以侦听任何类型的事件,或者可以发布任何它想要的事件。任何人在倾听,都会得到这些数据。

在您的示例中:出租车中央可以发布/推送事件,如轮班更改,交通事故(位置),出租车请求(位置)或其他类似的事情,整个出租车组将会听。个人出租车将出版诸如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的代码调用,以及任何类...实际上任何数量的类,你都可以拥有多个订阅者,将能够捕获已发布的事件。

+0

感谢您的解释!我想如果我还必须使用WPF窗口,它会更加复杂。出租车中央是主窗口,所有的出租车都有用于说明目的的用户窗口。那么我必须在小步骤中完成 – 2012-08-08 16:43:39

+0

在我的指导中,我将定义三个EventArgs信息类,它们是从EventArgs派生的?我不确定那是什么意思?从EventArgs派生的部分? – 2012-08-08 16:56:50

+0

是这个家庭作业?如果是这样,请添加作业标签。您似乎有一组相当具体的要求... EventArgs是EventHander用来将参数传递到订阅者函数的通用类。通过创建该类的自定义实现,您可以让事件发布比“DoStuff”更多的特定数据。您可以在“OnDoStuff”发布呼叫中填充此数据。 – Nevyn 2012-08-08 17:03:41

0

您必须考虑“事件驱动”条款。在您的示例中,taxitntral和出租车可能都有发布商角色,以及taxitntral和出租车的用户角色。

例如,如果taxicentral有更新推送到所有的出租车,它可以有一个事件,它引发和出租车收听。然后,出租车在他们接送某人时可能会举行一次活动,并且税务中心会听取所有这些活动。

这有帮助吗?

+0

嗯,也许,所以每一个可能的事件应该是一个自己的类或方法? – 2012-08-08 15:44:38

+0

代表是您创建的自定义事件。其中包含的事件,打包的数据,你想要的。这可能不是什么超越,“嘿,事件发生了”,但它可能是,“事件发生了,它是#34号出租车”。然后,使用委托创建要触发并捕获的事件的每个实例。 – 2012-08-08 15:46:17

+0

我对一些简单的代码更了解吗? – 2012-08-08 16:15:16

0

委托不用于向其他方法发送方法。它们用于调用在编译时可能未知的方法。

让我们来看一个简单的例子。考虑一下,你写一个计算器,用户可以选择参数和操作。该操作可以是执行计算的方法的委托。因此,您不必担心如何存储操作。此外,计算器不需要知道每个操作,因为用户将提供它。

代表的一个常见示例是回调函数。如果您在第二个线程中启动了一个长期过程,则可能需要在线程完成时收到通知。您可以通过在过程完成时向被调用的线程提供委托来完成此操作。

活动是一种特殊类型的代表。当对象想要通知其他人状态更改或类似操作时,可以使用它们。特别的是,对象本身并不需要知道哪些对象对变化感兴趣。相反,这些对象订阅事件。提供事件的对象只需调用事件的委托,并调用所有的用户委托。由于贾斯丁C已经解释过,出租车中央和出租车可以充当订户和出版商。这取决于谁对什么感兴趣。如果每个人都可以订阅这些活动。如果只允许出租车中心获取信息,则回拨方式更适合。

+0

感谢您的信息!不知道我该如何编码?我找不到任何简单的代码示例。你能否展示一些代码给我一些启发? – 2012-08-08 15:54:35

相关问题