我可以为下面的派生类消除重复的代码,然后转到抽象基类吗

时间:2018-10-07 16:49:40

标签: c# inheritance

我有一个抽象基类,开始一个timer,这对所有派生类都是通用的,

public abstract class BaseClass
{
    public virtual void Start() { _timer.Start(); }
}

现在我需要为每个派生类加载不同的JSON配置文件并创建文件,

public class DerivedClass1 : BaseClass
{
    private readonly List<config> configs = new List<config>();

    public DerivedClass1()
    {
        configs = JsonSettings.GetConfigurations(@"./Configurations/1.json");
    }
    public override void Start()
    {
        base.Start();

        foreach (var configuration in configs)
        {
            JsonSettings.CreateConfigFile(configuration);
        }
    }
}

public class DerivedClass2 : BaseClass
{
    private readonly List<config> configs = new List<config>();

    public DerivedClass2()
    {
        configs = JsonSettings.GetConfigurations(@"./Configurations/2.json");
    }
    public override void Start()
    {
        base.Start();

        foreach (var configuration in configs)
        {
            JsonSettings.CreateConfigFile(configuration);
        }
    }
}

如我所见,在各种派生类中有很多重复的代码。

我可以移动这段代码以及abstract base类,还是有其他方法?

3 个答案:

答案 0 :(得分:3)

我认为您可以将代码简化为:

public abstract class BaseClass
{
    protected virtual List<config> configs { get; set; } = new List<config>();
    public virtual void Start()
    {
        _timer.Start();
        foreach (var configuration in configs)
        {
            JsonSettings.CreateConfigFile(configuration);
        }
    }
}

public class DerivedClass1 : BaseClass
{
    public DerivedClass1()
    {
        configs = JsonSettings.GetConfigurations(@"./Configurations/1.json");
    }
}

public class DerivedClass2 : BaseClass
{
    public DerivedClass2()
    {
        configs = JsonSettings.GetConfigurations(@"./Configurations/2.json");
    }
}

答案 1 :(得分:2)

public interface BaseClass
{
    void Start();
}

public interface IBaseClassUtil
{
    void Start();
    void setConfigs(List<config> configs);
}

public class BaseClassUtil : IBaseClassUtil
{
    System.Timers.Timer _timer;
    public  List<config> _configs { get; set; } = new List<config>();
    public void Start()
    {
        _timer.Start();
        foreach (var configuration in _configs)
        {
            JsonSettings.CreateConfigFile(configuration);
        }
    }

    public void setConfigs(List<config> configs)
    {
        _configs = configs;
    }
}
public class DerivedClass1 : BaseClass
{
    private IBaseClassUtil _baseUtility;
    public DerivedClass1(IBaseClassUtil baseUtility)
    {
        _baseUtility = baseUtility;
        _baseUtility.setConfigs( JsonSettings.GetConfigurations(@"./Configurations/1.json"));
    }

    public void Start()
    {
        _baseUtility.Start();
    }
}

public class DerivedClass2 : BaseClass
{
    private IBaseClassUtil _baseUtility;
    public DerivedClass2(IBaseClassUtil baseUtility)
    {
        _baseUtility = baseUtility;
        _baseUtility.setConfigs(JsonSettings.GetConfigurations(@"./Configurations/2.json"));
    }

    public void Start()
    {
        _baseUtility.Start();
    }
}

这可能是工程设计的。或可能不符合您当前的要求。 优点是

  1. 将来,如果您想让IBaseClassUtil具有不同的实现,将会更容易

    1. 巨大的优势是该代码是可测试的

答案 2 :(得分:1)

如果这些类除配置路径外没有其他区别,那么您只能有一个派生类将其路径作为其ctor中的参数。

public DerivedClass(string configurationPath)
{
    configs = JsonSettings.GetConfigurations(configurationPath);
}

请注意,决定是否将继承包含在您的体系结构中不是代码重复,而是通过不向我们提供有关函数或类名的任何信息(BaseClass DerivedClass没什么意思。它们代表什么?它们的功能是什么?它们为什么相关?)您无法给我们提供真正帮助您进行设计的方法。