当前位置: 首页 > 编程语言 > C#

虚拟调用和类型检查的另一个例子分享

时间:2023-04-10 13:09:11 C#

虚拟调用和类型检查的另一个例子问题我发誓,每次我脑子里乱砸的时候,我应该使用虚拟调用和类型检查(eg:if(objisFoo)...elseif(objisBar)......我想出了另一个例子,我不知道如何实现前者。我正在通过串行实现一个打包协议。一些伪代码将对此进行解释:OnDataReceived:RcvPacketp=RcvPacket.ReadPacket(comport);//调用工厂方法if(pisRcvPacketFoo)OnFoo();if(pisRcvPacketBar)OnBar();OnFoo:raiseFooeventOnBar:引发Bar事件基本上,ReadPacket是基类中的一个工厂方法,它确定接收到的数据包类型并将缓冲区传递给正确的派生类型构造函数。在此之后,我需要根据数据包类型引发事件。我怎么能在不使用is运算符的情况下执行此操作?我的方法听起来明智吗?当然是解决访客模式!谢谢PabloRomeo。在这种情况下,我让调用工厂方法的控制器成为访问者。我的结果:publicinterfaceIPacketHandler{voidHandle(FooPacketp);voidHandle(BarPacketp);}公共类控制器:IPacketHandler{OnDataReceived(){RcvPacketp=RcvPacket.ReadPacket(comport);//调用工厂方法p.Handle(this);//***VirtualCall:Thefirstdispatch***}//注意这里使用显式接口实现。IPacketHandler.Handle(FooPacketp){OnFoo();}IPacketHandler.Handle(BarPacketp){OnBar();}}publicabstractclassRcvPacket{publicstaticRcvPacketReadPacket(...){...}//工厂方法publicvoidHandle(IPacketHandlerhandler);}publicclassFooPacket:RcvPacket{publicoverridevoidHandle(IPacketHandlerhandler){handler.Handle(this);//***重载调用:第二次调度***}}publicclassBarPacket:RcvPacket{publicoverridevoidHandle(IPacketHandlerhandler){handler.Handle(this);//***Overloadedcall:Theseconddispatch***}}这里有趣的是,通过显式现实访问者界面,Handle调用基础上是隐藏的。来自MSDN:实现接口的类可以显式实现该接口的成员。当一个成员被显式实现时,它不能通过类的实例访问,只能通过接口的实例访问。好吧,考虑到您可能不想在每个数据包中添加任何额外的逻辑,您可以通过DoubleDispatch来实现。在那种情况下,我可能会创建一个接口,如:publicinterfaceIPacketEvents{voidOn(Foofoo);voidOn(酒吧酒吧);我假设你有一个用于所有数据包的基类。我会在其中声明:publicabstractvoidRaiseUsing(IPacketEventsevents);包的每个子类将实现以下内容:publicoverridevoidRaiseUsing(IPacketEventsevents){events.On(this);你可以有一个新类实现IPacketEvents的同一个类,或者你调用工厂可以实现它。在第二种情况下,您的呼叫以:OnDataReceived:RcvPacketp=RcvPacket.ReadPacket(comport);结束。//调用工厂方法p.RaiseUsing(this);使用这种类型的调度,你得到的是每个类型调用相应的方法,因为它“知道”要调用哪个。我可能会对所有方法使用相同的“On”名称感到困惑,但这并不是完全必要的。它们可以是OnFoo()和OnBar()。这种行为也用在访问者模式中。我能想到的唯一方法是将OnFoo和OnBar的实现移至RcvPacketFoo和RcvPacketBar类。以上就是C#学习教程分享的全部内容:又一个虚调用和类型检查的例子。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——publicclassRcvPacket{publicabstractvoidOn(RcvPacketHandlereh);}publicclassRcvPacketFoo:RcvPacket{publicoverridevoidOn(RcvPacketHandlereh){eh.();}//OnBar实现}//根据您的评论更新:publicclassRcvPacketHandler{publicvoidOnFoo(){}publicvoidOnBar(){}//....OnDataReceived:RcvPacketp=RcvPacket.ReadPacket(comport);//调用工厂方法p.On(this);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: