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

如何为所有类定义相同方法?批量优化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:50:35