您的位置:程序门 -> .net技术 -> vb.net



高手进来,vb.net的generic问题请教!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


高手进来,vb.net的generic问题请教!
发表于:2008-01-07 09:58:18 楼主
public   class   doubledispatcher(of   tlhs,   trhs,   treturn)

                public   delegate   function   dispatchcallback(of   tconcretelhs   as   tlhs,   tconcreterhs   as   trhs)(byval   lhs   as   tconcretelhs,   byval   rhs   as   tconcreterhs)   as   treturn

                protected   sub   registercallback(of   tconcretelhs   as   tlhs,   tconcreterhs   as   trhs)(byval   callback   as   dispatchcallback(of   tconcretelhs,   tconcreterhs))
                        _callback   =   callback         ' <---compile   error
                end   sub

                private   _callback   as   dispatchcallback(of   tlhs,   trhs)

end   class

请问,应该如何定义_callback或者转换callback?   使编译能通过?
发表于:2008-01-07 10:26:441楼 得分:0
up
发表于:2008-01-07 16:02:532楼 得分:0
修改delegate的定义:
public       delegate       function       dispatchcallback(byval       lhs       as       tconcretelhs,       byval       rhs       as       tconcreterhs)       as       treturn
发表于:2008-01-07 16:03:423楼 得分:0
。。。写错了
public       delegate       function       dispatchcallback(byval       lhs       as       tlhs,       byval       rhs       as       trhs)       as       treturn
发表于:2008-01-08 10:06:174楼 得分:0
delegate的dispatchcallback是不能修改的,否则函数registercallback定义也要跟着做修改了。
只能修改_callback的定义或者转换callback那里的代码,有没有办法?
发表于:2008-01-08 12:29:435楼 得分:0
哦,明白你的意思了,双/多分派不能这么实现,如果要实现双/多分派的话,建议看一下访问者(visitor)模式
对.net而言,list(of   integer)和list(of   object)是两个完全没有关系的类,同理,你的2个泛不同型的dispatchcallback也是两个完全没有关系的类,所以,会出编译错误。
当然,可以硬转成delegate类型,在用dynamicinvoke来访问,但是这个dynamicinvoke的效率是非常低的(和反射的效率一样),如果不关心效率的话,也无所谓。
发表于:2008-01-08 15:37:456楼 得分:0
果然是高手,看出我是想实现双/多分派。不过,实现双/多分派并不一定要用访问者(visitor)模式。
gotdotnet上有个c#写的generic   double   dispatch   engine确实很精简,没事试着转化为vb.net版,却发现因为vb.net   8.0不支持匿名函数,所以实现有点困难,到这里找帮助来了!
发表于:2008-01-08 15:44:347楼 得分:0
这个还没看过,先学习一下generic   double   dispatch   engine
发表于:2008-01-08 16:02:228楼 得分:0
主要就是:
c# code
// ... dispatchcallback callbackthunk = delegate(tlhs lhs, trhs rhs) { return callback((tconcretelhs)lhs, (tconcreterhs)rhs); }; // ...

翻译成vb.net就是:
vb.net code
'... dim foo as new foo(of tconcretelhs, tconcreterhs) foo.callback = callback dim callbackthunk as dispatchcallback = new dispatchcallback(addressof foo.bar) '... private class foo(of tconcretelhs as tlhs, tconcreterhs as trhs) public callback as dispatchcallback(of tconcretelhs, tconcreterhs) public function bar(lhs as tlhs, rhs as trhs) as treturn return callback(directcast(lhs, tconcretelhs), directcast(rhs, tconcreterhs)) end function end class

匿名委托大概就是这样子翻译
发表于:2008-01-08 16:22:259楼 得分:0
可以了,加分!
发表于:2008-01-08 16:49:4810楼 得分:0
这个方法与visitor模式相比较,需要额外注意一点
如果是参数都是接口的话,可能会有点问题
interface   ibase
'...
interface   ia
      inherits   ibase
'...
interface   ib
      inherits   ibase
'...
创建generic   double   dispatch   engine,并且设置为isassignable策略(否则没有可能匹配的了。。。)
注册两个回调分别处理ia和ib
class   foo
      implements   ia,ib
'...
将foo的实例交给engine后,engine会回调其中的一个(具体是fullname较小的那个,但是那个不一定是想要跑得那个)
而visitor模式在编译时会出错,需要程序明确指出要调用ia的重载还是ib的重载


快速检索

最新资讯
热门点击