首页 新闻 会员 周边

如何抽象下面这两个方法?

0
悬赏园豆:50 [已关闭问题]
<P>&nbsp;下面两个方法ListDelete(List&lt;BaseDT&gt; details)和ListDelete(BaseDT[] list),这两个方法除了参数以及一小段代码不一样外,其他的都相同。各位高人谁能帮我抽象出一个方法?</P> <P>我有一个思路,就是定义一个参数为Object类型或DataSet类型的委托,然后在方法中调用这个委托,总是觉得不好,希望高人能提供一个完美方案。<BR><BR></P> <P>/// &lt;summary&gt;<BR>&nbsp;&nbsp;&nbsp; /// 删除多条记录。<BR>&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<BR>&nbsp;&nbsp;&nbsp; /// &lt;param name="details"&gt;记录集和&lt;/param&gt;<BR>&nbsp;&nbsp;&nbsp; public void ListDelete(List&lt;BaseDT&gt; details)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bool selfTran = false;</P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //事务处理<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.BeginTran();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; selfTran = true;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foreach (BaseDT detail in details)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Delete(detail);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P> <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 提交事务<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (selfTran)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.CommitTran();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception ex)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 回滚事务<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (selfTran == true)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.RollBackTran();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw ex;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; }</P> <P>&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<BR>&nbsp;&nbsp;&nbsp; ///&nbsp; 删除多条记录。<BR>&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<BR>&nbsp;&nbsp;&nbsp; /// &lt;par
问题补充: 问题是这样的,有两个函数Function1和Function2。这两个函数中有一些代码是相同的例如: void Function(int x) { // 公共操作部分1 Response.Write(x + ""); // 公共操作部分2 } void Function(string y, int x) { // 公共操作部分1 Response.Write(y + x); // 公共操作部分2 } 在函数Function1和Function2中,“ 公共操作部分1”和“公共操作部分2”是相同的(例如: “公共操作部分1”为开始一个事物,“公共操作部分2”为提交一个事物)只有“Response.Write(x + "");”和“Response.Write(y + x);”是不同的。 我现在想写一个函数FunctionCommon用来处理函数Function1和Function2中的公共部分。 例如 void FunctionCommon(参数列表) { // 公共操作部分1 // ...(不同情况下,实现不同) // 公共操作部分2 } 那么在Function1和Function2中,仅仅需要处理它们独特的部分就可以了。 不知道如何实现这样的抽象。
荣-的主页 荣- | 初学一级 | 园豆:25
提问于:2007-11-30 17:42
< >
分享
其他回答(2)
0
ListDelete(IEnumerable<BaseDT> details) 然后里面用foreach即可。 一般来说,方法的参数用越“抽象”的数据类型越好,这样可以支持更多的数据类型,增加可复用度。而方法的参数越“具体”越好,这样可以让方法的调用者更灵活地使用。
Jeffrey Zhao | 园豆:1629 (小虾三级) | 2007-11-30 17:46
0
这个时候可以看一下List<BaseDT>和BaseDT[](Array类)有无共性 通过Code Definition Window可以看到 两者的共同接口有:IList, ICollection, IEnumerable 而你的方法名为ListDelete 所以用IList类型参数较好
Anders Cui | 园豆:1570 (小虾三级) | 2007-11-30 18:44
0
基本上就可以…… 理由:因为两者的实现在你的代码中可以看出,只用到了参数的迭代器的特性,“最小匹配”原则一下,你可以将其指定为IEnumerable。如果有其他需求,可以再放宽要求。 测试: class GenericClass { public static void ListDelete1<T>(T list) where T : IEnumerable<IDB> { foreach (IDB item in list) { item.Delete(); } } public static void ListDelete2<T>(IEnumerable<T> list) where T : IDB { foreach (T item in list) { item.Delete(); } } public static void ListDelete3<T>(T list) where T : IEnumerable { foreach (IDB item in list) { if (item is IDB) (item as IDB).Delete(); //if (i is OtherInterface) // (item as OtherInterface).Delete(); } } public interface IDB { //Other members void Delete(); } public class BaseDT:IDB { public void Delete() { Console.WriteLine("succeed delete!"); } } class Program { static void Main(string[] args) { List<GenericClass.IDB> list1 = new List<GenericClass.IDB>(); list1.Add(new GenericClass.BaseDT()); list1.Add(new GenericClass.BaseDT()); list1.Add(new GenericClass.BaseDT()); list1.Add(new GenericClass.BaseDT()); GenericClass.ListDelete1<IEnumerable<GenericClass.IDB>>(list1); Console.WriteLine("========================"); GenericClass.IDB[] list2 = new GenericClass.IDB[] { new GenericClass.BaseDT(), new GenericClass.BaseDT(), new GenericClass.BaseDT() }; GenericClass.ListDelete1<IEnumerable<GenericClass.IDB>>(list2); Console.WriteLine("========================"); List<GenericClass.IDB> list3 = new List<GenericClass.IDB>(); list3.Add(new GenericClass.BaseDT()); list3.Add(new GenericClass.BaseDT()); list3.Add(new GenericClass.BaseDT()); list3.Add(new GenericClass.BaseDT()); GenericClass.ListDelete2<GenericClass.IDB>(list3); Console.WriteLine("========================"); GenericClass.IDB[] list4 = new GenericClass.IDB[] { new GenericClass.BaseDT(), new GenericClass.BaseDT(), new GenericClass.BaseDT() }; GenericClass.ListDelete2<GenericClass.IDB>(list4); Console.WriteLine("========================"); List<GenericClass.IDB> list5 = new List<GenericClass.IDB>(); list5.Add(new GenericClass.BaseDT()); list5.Add(new GenericClass.BaseDT()); list5.Add(new GenericClass.BaseDT()); list5.Add(new GenericClass.BaseDT()); GenericClass.ListDelete3<IEnumerable>(list5); Console.WriteLine("========================"); GenericClass.IDB[] list6 = new GenericClass.IDB[] { new GenericClass.BaseDT(), new GenericClass.BaseDT(), new GenericClass.BaseDT() }; GenericClass.ListDelete3<IEnumerable>(list6); } } 其实上面的方法也是可以的,只要你对实现IDB的方法实现自己特殊的部分,比如说: public sealed class ClassA : IDB { public string X {get;set;} public string Y {get;set;} public string IDB.GetResult() { return (X+Y); } public sealed class ClassB : IDB { public string X {get;set;} public string IDB.GetResult() { return X; } } } 这样,你统一调用Response.Write(IDB.GetResult());就可以了 这就是最基本的多态啦撒……
volnet(可以叫我大V) | 园豆:720 (小虾三级) | 2007-11-30 20:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册