问题描述
定义了一个规则类,属性字段相同并且都还有一个parse方法,但各对象的parse防范实现上稍有差别。如果不定义子类,能在对象创建的时候改写parse方法吗?classrule{privatestring_title="";privatestring_regex="";publicstringtilte{get{returnthis._title;}set{this._title=value}}......publicstringparse(stringinput){stringoutput="";returnoutput;}}......publicArrayListruleNode=newArrayList();ruletmp=newrule();tmp.title="title1";//tmp.parse方法不同示例稍有不同,能有办法改写吗?ruleNode.add(tmp);ruletmp=newrule();tmp.title="title2";//tmp.parse方法不同示例稍有不同,能有办法改写吗?ruleNode.add(tmp);......另外想到的一种方案是,将parse也定义成字符串属性,通过在线编译来实现执行不同的效果。还有其他方案吗?
解决方案
解决方案二:
类创建之后,就不能改写了,除非你做成动态解析的
解决方案三:
创建rule的父类,每个实现下面有不同的parse要么就传参数,parse里面有switch
解决方案四:
你说的“动态解析”是怎么做?引用1楼bdmh的回复:
类创建之后,就不能改写了,除非你做成动态解析的
解决方案五:
如果将规则创建为很多子类,使用时遍历ArrayListruleNode,如何强制转换类型?foreach(???tmpinanalyser.ruleNode){}引用2楼thedolphin的回复:
创建rule的父类,每个实现下面有不同的parse要么就传参数,parse里面有switch
解决方案六:
foreach(ruletmpinanalyser.ruleNode){((rule1)tmp).parse()}??
解决方案七:
该回复于2012-03-27 13:28:08被版主删除
解决方案八:
ruleNode里面对象很多,如果他们是不同的子类,不可能分得清的,也不可能像这样转换:((rule1)tmp).parse()该转换成ruleX呢?引用5楼sql777的回复:
foreach(ruletmpinanalyser.ruleNode){((rule1)tmp).parse()}??
解决方案九:
if(tmpisruleX)((ruleX)tmp).parse()
解决方案十:
ruleX很多,真不方便逐个判断。引用8楼xiaoyu821120的回复:
if(tmpisruleX)((ruleX)tmp).parse()
解决方案十一:
引用7楼的回复:
ruleNode里面对象很多,如果他们是不同的子类,不可能分得清的,也不可能像这样转换:((rule1)tmp).parse()该转换成ruleX呢?引用5楼sql777的回复:foreach(ruletmpinanalyser.ruleNode){((rule1)tmp).parse();}??
用List<rule>ltrule=newList<rule>();ltrule.Add(rule1);ltrule.Add(rule2);foreach(rulerinltrule){r.parse();//无参数的话r不需要转换成你想要的}