如何为所有类定义相同方法?批量优化D1-D100类重复代码
解决两个重复编码问题的可行方案
一、批量实例化子类并统一设置属性
因为所有D1~D100都是Data的嵌套类且继承自Inputs,可以用反射批量处理,不用手动写100次实例化代码:
// 获取Data类下所有继承自Inputs的嵌套子类 var dataSubTypes = typeof(Data).GetNestedTypes() .Where(t => t.IsSubclassOf(typeof(Inputs))); List<Inputs> instances = new List<Inputs>(); foreach (var type in dataSubTypes) { // 实例化子类 var instance = (Inputs)Activator.CreateInstance(type); // 统一设置属性 instance.firstname = "first"; instance.lastname = "last"; // 按需添加其他属性 instances.Add(instance); } // 如需单独获取某个子类实例 var d1Instance = instances.FirstOrDefault(t => t.GetType() == typeof(Data.D1));
如果需要给不同子类设置不同属性值,可以提前准备配置字典(比如Dictionary<Type, string> firstNameMap),遍历的时候对应取值即可。
二、让所有子类拥有相同方法的三种方案
方案1:在基类Inputs中定义方法(最直接)
既然所有子类都继承Inputs,直接在基类里添加方法,子类自动继承,完全避免重复编码:
public class Inputs { public string firstname { get; set; } public string lastname { get; set; } // 所有子类共享的方法 public void PrintFullName() { Console.WriteLine($"Full Name: {firstname} {lastname}"); } // 如需子类自定义部分逻辑,用虚方法 public virtual void CustomLogic() { Console.WriteLine("Default logic from Inputs"); } } // 子类仅需在需要自定义时重写方法,无需重复编写默认逻辑 public class Data { public class D1 : Inputs { public override void CustomLogic() { Console.WriteLine("Custom logic for D1"); } } // D2~D100无需重复写方法,直接继承基类实现 }
方案2:使用扩展方法(无需修改基类)
如果不能修改Inputs基类,可以给Inputs写扩展方法,所有子类都能直接调用:
public static class InputsExtensions { public static void PrintFullName(this Inputs input) { Console.WriteLine($"Full Name: {input.firstname} {input.lastname}"); } } // 使用方式:任何子类实例都能直接调用 Data.D1 d1 = new Data.D1(); d1.firstname = "Alice"; d1.lastname = "Smith"; d1.PrintFullName(); // 输出Full Name: Alice Smith
方案3:利用接口默认方法(C# 8.0+)
定义一个带默认实现的接口,让所有D1~D100实现该接口,无需每个子类都写方法代码:
public interface ISharedMethod { void PrintFullName() { var input = this as Inputs; if (input != null) { Console.WriteLine($"Full Name: {input.firstname} {input.lastname}"); } } } // 子类只需添加接口实现即可自动获得方法 public class Data { public class D1 : Inputs, ISharedMethod { } public class D2 : Inputs, ISharedMethod { } // D3~D100同理,仅需添加ISharedMethod接口 } // 使用方式 Data.D2 d2 = new Data.D2(); d2.firstname = "Bob"; d2.lastname = "Jones"; d2.PrintFullName(); // 输出Full Name: Bob Jones
内容的提问来源于stack exchange,提问作者Done Nothing
相关产品推荐
相关产品推荐

