我可以消除以下派生类的重复代码并移动到抽象基类吗?



我有一个抽象的基类,开始一个所有派生类共有的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类还是有其他方法?

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

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");
}
}
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();
}
}

这可能是 oveer 设计的。或者可能不适合您当前的需求。 优点将是

  1. 将来,如果您希望为IBaseClassUtil提供不同的实现,它将更容易

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

如果类仅因配置路径而异,则只能有一个派生类将该路径作为其 ctor 中的参数。

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

请注意,在架构中包含继承的决定代码重复无关,并且不向我们提供有关函数甚至类名称的任何信息(BaseClassDerivedClass没有任何意义。它们代表什么?它们的功能是什么?它们为什么相关?你没有给我们任何办法真正帮助你的设计。

最新更新