现在的位置: 首页 > 综合 > 正文

why don’t by signature! –对知秋一叶的回应

2011年04月16日 ⁄ 综合 ⁄ 共 994字 ⁄ 字号 评论关闭

原帖:http://blog.joycode.com/qqchen/posts/19255.aspx

谢谢qqchen一再耐心解释,然而我感觉我这个人有点冥顽不化..  希望不要见怪。

一些朋友认为我对.net泛型不满是因为没有特化,事实上并不是这样,我对于.net难以实现特化很理解,因为.net选择了泛型代码共享,虽然这导致特化的难以实现,但这并不是一个没有理由的选择。(当然我觉得C++的选择也没有错,因为在C++里,如果没有模板,你就必须为每一个类写一个vector,所以还不如让模板自动生成,这主要是因为C++里没有一个公共基类System.Object造成的)

同时,我对约束也是很理解的,正是因为C++没有显示的约束概念(虽然约束已经隐含在编译器的工作中了)导致很多出错信息宛若天书,(当然也有typedef的错 :p),我还没有忘记当我还不理解模板技术时,面对这些出错信息的感受,(即使现在还是很头大)。当第一次听说.net 泛型的约束的概念时,我还很激动。

然而,我对约束在.net中的实现实在大失所望。我想象中的约束应该是你文中所说的by signature的实现。

选择一项技术都得有一个理由,我只是想知道目前.net中这种对约束的实现,以降低泛型灵活的代价,换回了什么?

我们都知道即便.net有这样强大执行期类型支持,但对泛型参数的检查,还是和C++一样完全在编译期完成了。完全的意思就是,对于泛型类,检查类型参数是不是符合约束,对于泛型方法,则是检查传入的参数的声明类型是不是符合约束。注意是声明类型,我针对这点做的这个实验,是我为找到选择目前这种约束实现的理由的最后一点努力。然而我其实也知道那个实验很无聊,因为对泛型参数的检查不可能基于对象的实际类型,而不基于对象的声明类型,因为那样将把泛型参数检查推迟到执行期,这是不能容忍。

所以我现在想不到任何不选择by signature方式的理由,唯一可能的解释,或许是现在的实现更“面向对象”一点。 by signature显然不是OO纯粹论者能容忍,但by inheritance却显得很美很纯粹很OO。我多希望以上的揣测,都只是我的小人之见。

我想我只是有一点遗憾。但C#总还是要用下去的,它不可能为了我而改变,改变的只能是我自己。而且.net毕竟有了泛型,虽然不如意,但泛型的HashTable总比Object的版本要可爱很多了。

抱歉!评论已关闭.