.NET Framework 4.8中如何将解析器类作为参数实现函数复用?
如何复用仅依赖不同解析类的重复逻辑?
你有7个逻辑完全一致的函数,唯一区别是用到的解析类不同(比如Parser和Parser2),这些类都有同名的ParseFiles方法但实现不同,示例代码如下:
private void modifier() { foreach (variable_type entry in new Parser().ParseFiles(generic_input)) {...} return; }
private void modifiertypes() { foreach (variable_type entry in new Parser2().ParseFiles(generic_input)) {...} return; }
完全可以通过依赖抽象而非具体类的方式实现逻辑复用,不需要维护多个重复函数,下面是几种可行方案:
1. 定义接口(最推荐的方式)
先定义一个包含ParseFiles方法的接口,让所有解析类都实现这个接口:
public interface IParser { IEnumerable<variable_type> ParseFiles(string generic_input); // 参数类型可根据实际场景调整 } // Parser类实现接口 public class Parser : IParser { public IEnumerable<variable_type> ParseFiles(string generic_input) { // 原有实现代码 } } // Parser2类同样实现接口 public class Parser2 : IParser { public IEnumerable<variable_type> ParseFiles(string generic_input) { // 原有实现代码 } }
然后把重复逻辑抽成一个通用函数,接收IParser类型的参数:
private void ModifyWithParser(IParser parser) { foreach (variable_type entry in parser.ParseFiles(generic_input)) { // 原有的循环逻辑,完全复用 } }
调用时直接传入不同解析类的实例即可:
// 使用Parser处理 ModifyWithParser(new Parser()); // 使用Parser2处理 ModifyWithParser(new Parser2());
2. 使用委托(无需定义接口的轻量方案)
如果只需要针对ParseFiles这个方法传递逻辑,可以用委托实现:
先定义匹配ParseFiles方法签名的委托:
public delegate IEnumerable<variable_type> ParseFilesDelegate(string input);
然后通用函数接收这个委托参数:
private void ModifyWithParseMethod(ParseFilesDelegate parseMethod) { foreach (variable_type entry in parseMethod(generic_input)) { // 复用的循环逻辑 } }
调用时直接传入对应类的方法:
// 传入Parser的ParseFiles方法 ModifyWithParseMethod(new Parser().ParseFiles); // 传入Parser2的ParseFiles方法 ModifyWithParseMethod(new Parser2().ParseFiles);
3. 泛型配合约束(适用于类有统一构造逻辑的场景)
如果所有解析类都有无参构造函数,也可以用泛型+约束的方式:
private void Modify<T>() where T : IParser, new() { foreach (variable_type entry in new T().ParseFiles(generic_input)) { // 复用逻辑 } }
调用时指定泛型类型:
Modify<Parser>(); Modify<Parser2>();
方案对比
最推荐接口方案,它遵循面向对象的依赖倒置原则,代码扩展性更强——后续新增解析类时,只要实现IParser接口就能直接复用通用函数,不需要修改原有逻辑。
内容的提问来源于stack exchange,提问作者Filipe
相关产品推荐
相关产品推荐

