You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用父类实现单个方法替代两个子类的重复方法?

统一创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:25:32