我有一个抽象基类,开始一个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
类,还是有其他方法?
答案 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();
}
}
这可能是工程设计的。或可能不符合您当前的要求。 优点是
将来,如果您想让IBaseClassUtil具有不同的实现,将会更容易
答案 2 :(得分:1)
如果这些类除配置路径外没有其他区别,那么您只能有一个派生类将其路径作为其ctor中的参数。
public DerivedClass(string configurationPath)
{
configs = JsonSettings.GetConfigurations(configurationPath);
}
请注意,决定是否将继承包含在您的体系结构中不是代码重复,而是通过不向我们提供有关函数或类名的任何信息(BaseClass
DerivedClass
没什么意思。它们代表什么?它们的功能是什么?它们为什么相关?)您无法给我们提供真正帮助您进行设计的方法。