如何用父类实现单个方法替代两个子类的重复方法?
统一创建Throw子类实例的泛型方案
没问题,咱们可以用泛型方法来搞定这个需求,把两个重复的子类创建方法合并成一个基于父类Throw的通用方法,既减少重复代码,还能保证类型安全。
实现思路
利用C#的泛型约束,限定方法只能处理Throw的子类,并且要求子类必须有无参构造函数(因为要通过new T()创建实例),这样就能用同一个方法创建任意Throw子类的对象。
完整代码实现
// 原有的类定义保持不变 public class Throw { public double speed { get; set; } public double accurency { get; set; } } public class FastThrow : Throw{} public class LowThrow : Throw{} // 替换原有两个静态方法的通用泛型方法 public static T SetThrow<T>(List<object> args) where T : Throw, new() { // 先做参数校验,避免空引用或参数不足的问题 if (args == null || args.Count < 2) { throw new ArgumentException("参数列表必须包含至少两个可转换为double的元素"); } // 转换参数并返回子类实例 return new T { speed = Convert.ToDouble(args[0]), accurency = Convert.ToDouble(args[1]) }; }
使用方式
调用的时候只需要指定具体的子类类型即可:
// 创建FastThrow实例 var fastThrow = SetThrow<FastThrow>(new List<object> { 92.0, 88.5 }); // 创建LowThrow实例 var lowThrow = SetThrow<LowThrow>(new List<object> { 35.5, 96.0 });
方案优势
- 消除重复代码:原来两个方法的逻辑几乎完全一致,泛型方法把这些逻辑抽离,后期维护只需要改这一处
- 类型安全:通过
where T : Throw约束,确保只能传入Throw的子类,避免错误类型的传入 - 扩展性强:如果以后新增
Throw的子类(比如AccurateThrow),不需要再写新的创建方法,直接用SetThrow<AccurateThrow>就能创建实例 - 更健壮:用
Convert.ToDouble替代直接强制转换,能处理更多可以转换为double的类型(比如字符串"90.5"),同时加了参数校验,避免运行时异常
内容的提问来源于stack exchange,提问作者gorrch
相关产品推荐
相关产品推荐

