才发现FCL中的String类居然是seal的 今天想自己定义一个业务专用的字符串类,结果发现居然没法重载string,超级郁闷,好好的一个类干吗给封了,定制某个业务专用的字符串类应该是非常平常的一件事吧.........除了设一个string 的字段还有没有什么更好的方法?有明白的来帮个忙。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 楼主基础知识要补一补了重载string? 重载的意思是一个同名函数可以参数不同而衍生出不同的版本~ 基元类型,只接用了,不用重载。string.Method(...) 现在的方法是自己做一个对string的隐式转换,然后写一堆类似于这样的东西:public int Length{ get{return str.Length;}}不知道还有没有什么好的办法。 应该是继承,是想说重载string的函数....... String是一个特殊的类,系统本身对其进行了很多优化如果可以继承会破坏CLR对String所做的假设 写一个静态类,传入string参数即可 当然是seal了,不然这种基础类整出n个版本来,那还不出大乱子啊使用聚合,wrapper一下好了 基元类型,只接用了,不用重载。string.Method(...)--------------------------------举个例子,一个表示16进制数的字符串类似于"FE0187A2",那么它的Length从用户的角度来说,应该是str.Length/2吧,这只是简单的情况,复杂的呢?直接用只怕不太舒服吧........ 当然是seal了,不然这种基础类整出n个版本来,那还不出大乱子啊使用聚合,wrapper一下好了---------------------------谢谢,我现在就是用的这个方法,不过感觉基础类衍生出多个版本也没什么,反正是自己用,也有一些语言的string不是seal的,估计是ms在里面做了些转换或者优化的东西怕实现多态的时候容易出问题...... .net 3.0/3.5 可以使用扩展方法向string类额外添加方法 业务专用的字符串类啥叫业务专用的字符串类?字符串类只表示文字,没有其他含义。"FE0187A2",那么它的Length从用户的角度来说,应该是str.Length/2吧这个我就无语了,如果string的Length被重写还有谁敢用? 业务专用的字符串类啥叫业务专用的字符串类?字符串类只表示文字,没有其他含义。"FE0187A2",那么它的Length从用户的角度来说,应该是str.Length/2吧这个我就无语了,如果string的Length被重写还有谁敢用?-----------------------又不是在string类里重写,是在派生类里重写,其他人该怎么用不还是怎么用?你的类库只是给你的客户使用的,或者你提交类库给客户都没说明书的?string的确只表示字符串,没其他意义,但不代表它所派生的所有类都没有其他含义,中国字光排序的方法恐怕都不少于10种,难道ms能都给你列出来?开发公司给你类库是让你在这个基础上创造自己的东西,而不是光让你使用......."FE0187A2",那么它的Length从用户的角度来说,应该是str.Length/2,这个有什么不可以?就算你想让所有人都用,那也只要自己加个自定义属性类就一切搞定。string 之所以被封有可能是因为它特殊的地方,比如str1=str2;然后更改str1时出现的初始化现象,如果没有特殊原因,string是不应该被封的。 用C#3的扩展方法呀---------------------这个倒是没试验过,framework 3.0了解的不太多。 好多SYSTEM的类都是seal,不能继承. 继承的意义就在于重写,所有用到父类的地方,用子类也要同样可以。如果你把Length改成了Length/2,那.Net所有的程序不崩溃才怪。另外对于String这样特殊的类.Net已经在Object里加了ToString()方法了,你自己定义一个类然后重写ToString()方法不是更好吗? 继承的意义就在于重写,所有用到父类的地方,用子类也要同样可以。如果你把Length改成了Length/2,那.Net所有的程序不崩溃才怪。--------------------我用一个class HexString:String,重载他的Length函数,你来告诉我其他根本不知道HexString类的人的程序是怎么崩溃的,继承后只有子类的实例才能用子类的函数的,父类的实例根本用不了-_-! 这个是多态的基本规则。 如果按照你的想法,String str = new HexString("FE0187A2");你想要str.Length的结果是什么? 如果按照你的想法,String str = new HexString("FE0187A2");你想要str.Length的结果是什么?----------------------如果一个人连HexString是什么都不知道,那这么写就没办法了,就像如果一个人根本不知道string 是什么东西,那么它让object o=new String(); 然后调用o.ToString();他的本意还可能是想看看类型呢.....另外,我前面也写了,如果你想给你的客户用,那么就要明确的给出说明,就算你想让所有人都用,还怕混淆,那也只要自己加个自定义属性类就一切搞定,请注意阅读。 很简单的问题,HexString是不是String?是的话,String str = new HexString("FE0187A2");str.Length的结果是什么?想要让锤子继承剪刀的想法是不可取的。 很简单的问题,HexString是不是String?是的话,String str = new HexString("FE0187A2");str.Length的结果是什么?想要让锤子继承剪刀的想法是不可取的。---------------------------------------HexString的确是String,但谁规定的Length就一定是字符个数?按你这说法大家都不要重载了,否则都会混淆。 String是一个基础类,你如果要写一个HexString的类,就要包装一下,将String里面的函数全部重新定义,重写一遍。 只要有人认同String.Length不一定是字符个数的想法,那我就承认lz是对的,是MS错了…… 只要有人认同String.Length不一定是字符个数的想法,那我就承认lz是对的,是MS错了……------------------别偷换概念,String是ms做的,他说了算,我可没说它错,他感觉不好可以把Length不让重载,但把整个类封掉让人功能都没法添加显然不是好方法。 String是一个基础类,你如果要写一个HexString的类,就要包装一下,将String里面的函数全部重新定义,重写一遍。----------------------------没错,烦的就是这点,就算你只添加一个功能,也要重新定义全部函数和属性 C#实现手动开启和关闭无线网卡的动作 c#窗体编程问题,急~~~~~ 求教,怎么把几个select后的结果放到一条结果集中? 請問如何在ComboBoxCellType類型的Column中獲取選定項的値 哪位兄弟在winform上加载过flash,,,救命呀 别给连接,,要自己做过的。。。。 如何保存 输入一系列离散点,怎么画出等高线?算法是怎么的 做过语音视频聊天的进来谈谈 winform窗体修改密码出错求前辈们指点 请问一个程序暂停的问题!!! 咨询一个获取括号内值的正则表达式写法 datetime.tostring()问题?
重载string? 重载的意思是一个同名函数可以参数不同而衍生出不同的版本~
string.Method(...)
{
get{return str.Length;}
}不知道还有没有什么好的办法。
如果可以继承会破坏CLR对String所做的假设
string.Method(...)
--------------------------------
举个例子,一个表示16进制数的字符串类似于"FE0187A2",那么它的Length从用户的角度来说,应该是str.Length/2吧,这只是简单的情况,复杂的呢?直接用只怕不太舒服吧........
---------------------------
谢谢,我现在就是用的这个方法,不过感觉基础类衍生出多个版本也没什么,反正是自己用,也有一些语言的string不是seal的,估计是ms在里面做了些转换或者优化的东西怕实现多态的时候容易出问题......
啥叫业务专用的字符串类?字符串类只表示文字,没有其他含义。"FE0187A2",那么它的Length从用户的角度来说,应该是str.Length/2吧
这个我就无语了,如果string的Length被重写还有谁敢用?
啥叫业务专用的字符串类?字符串类只表示文字,没有其他含义。"FE0187A2",那么它的Length从用户的角度来说,应该是str.Length/2吧
这个我就无语了,如果string的Length被重写还有谁敢用?
-----------------------
又不是在string类里重写,是在派生类里重写,其他人该怎么用不还是怎么用?你的类库只是给你的客户使用的,或者你提交类库给客户都没说明书的?string的确只表示字符串,没其他意义,但不代表它所派生的所有类都没有其他含义,中国字光排序的方法恐怕都不少于10种,难道ms能都给你列出来?开发公司给你类库是让你在这个基础上创造自己的东西,而不是光让你使用.......
"FE0187A2",那么它的Length从用户的角度来说,应该是str.Length/2,这个有什么不可以?就算你想让所有人都用,那也只要自己加个自定义属性类就一切搞定。
string 之所以被封有可能是因为它特殊的地方,比如str1=str2;然后更改str1时出现的初始化现象,如果没有特殊原因,string是不应该被封的。
---------------------
这个倒是没试验过,framework 3.0了解的不太多。
另外对于String这样特殊的类.Net已经在Object里加了ToString()方法了,你自己定义一个类然后重写ToString()方法不是更好吗?
--------------------
我用一个class HexString:String,重载他的Length函数,你来告诉我其他根本不知道HexString类的人的程序是怎么崩溃的,继承后只有子类的实例才能用子类的函数的,父类的实例根本用不了-_-! 这个是多态的基本规则。
你想要str.Length的结果是什么?
你想要str.Length的结果是什么?
----------------------
如果一个人连HexString是什么都不知道,那这么写就没办法了,就像如果一个人根本不知道string 是什么东西,那么它让object o=new String(); 然后调用o.ToString();他的本意还可能是想看看类型呢.....另外,我前面也写了,如果你想给你的客户用,那么就要明确的给出说明,就算你想让所有人都用,还怕混淆,那也只要自己加个自定义属性类就一切搞定,请注意阅读。
是的话,String str = new HexString("FE0187A2");str.Length的结果是什么?想要让锤子继承剪刀的想法是不可取的。
是的话,String str = new HexString("FE0187A2");str.Length的结果是什么?想要让锤子继承剪刀的想法是不可取的。
---------------------------------------
HexString的确是String,但谁规定的Length就一定是字符个数?
按你这说法大家都不要重载了,否则都会混淆。
------------------
别偷换概念,String是ms做的,他说了算,我可没说它错,他感觉不好可以把Length不让重载,但把整个类封掉让人功能都没法添加显然不是好方法。
----------------------------
没错,烦的就是这点,就算你只添加一个功能,也要重新定义全部函数和属性