我有一个抽象的基类,开始一个所有派生类共有的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 设计的。或者可能不适合您当前的需求。 优点将是
将来,如果您希望为IBaseClassUtil提供不同的实现,它将更容易
。- 巨大的优势是这段代码是可测试的
如果类仅因配置路径而异,则只能有一个派生类将该路径作为其 ctor 中的参数。
public DerivedClass(string configurationPath)
{
configs = JsonSettings.GetConfigurations(configurationPath);
}
请注意,在架构中包含继承的决定与代码重复无关,并且不向我们提供有关函数甚至类名称的任何信息(BaseClass
和DerivedClass
没有任何意义。它们代表什么?它们的功能是什么?它们为什么相关?你没有给我们任何办法真正帮助你的设计。