我的项目设计课时遇到了麻烦。目前,我们开发了两个结构相同但内部存在差异的项目。
在项目A中,我的课程ACore
包含class AConfiguration, AEquipmentManager
。我为对象ACore
创建了一个实例,在项目的任何地方,我都可以使用:Acore.AConfiguration.XYZ
(XYZ是AConfiguration
类的方法或属性)或ACore.AEquipmentmanager.ABC
(ABC是AEquipmentManager
类的方法或属性
在项目B,我仍然与项目A(BCore, BConfiguration, BEquipmentManager
)具有相同的结构。但BConfiguration
与AConfiguration
不同(因为每个项目都有不同的配置),而BEquipmentManager
与AEquipmentManager
也有所不同。
我想重用类ACore
和BCore
的代码,因为它们具有相同的代码(Initialize EquipmentManager,Initialize Configuration,Dispose EquipmentManager,Dispose Configuration,...)。现在,我想编写一个与BaseCore
和ACore
具有相同结构的库BCore
(有2个类Configuration
,EquipmentManager
,同样的Intialize函数,Dispose函数),以及特定项目(如A项目,B项目,甚至更晚的C,D项目)我可以使用BaseCore
库类(用于重用代码)并只实现XEquipmentManager
,{ {1}}取决于每个项目。
在这种情况下,我应该设计的最佳方式是什么?感谢分享您的想法。
此致 Hoa Nguyen
答案 0 :(得分:0)
我认为你走在正确的轨道上,
但我会用接口来做:
实现使用实现IConfigurable的类的Core类。
确保AConfiguration实现IConfigurable和所有 相关方法。
另外,你可以这样做:
实现使用Configuration类的Core类。
实施继承自
的AConfiguration / BConfiguration
配置。
将A和B引用到同一个Core类,就是这样。
希望它有所帮助。
答案 1 :(得分:0)
AConfiguration和BConfiguration是否具有不同实现的相同方法集,或者set方法是否也有所不同?如果方法集相同,则可以使用接口来完成。您可以为配置和设备管理器定义接口。然后你只需使用BaseCore这些界面。然后你可以在BaseCore的构造中提供具体的实现这样的东西(省略单例的东西)
interface IConfiguration
{
void somefunc();
}
interface IEquipmentManager
{
void someOtherFunc();
}
class BaseCore
{
private IConfiguration conf;
private IEquipmentmanager eq;
private BaseCore(){};
public BaseCore(IConfiguration inConf, IEquipmentmanager inEq) :
conf(inConf), eq(inEq)
{
conf.someFunc();
}
}
class AConfiguration : IConfiguration
{
public void someFunc()
{
do stuff!
}
public int intprop{get;set;}
}
class AEquipmentmanager : IEquipmentmanager
{
public void someOtherFunc()
{
do stuff!
}
}
请注意,您必须初始化AConfiguration和AEquipmentmanager的实例。在像BaseCore这样构建之前
AConfiguration conf = new AConfiguration();
AEquipmentmanager eq = new AEquipmentmanager();
BaseCore base = new BaseCore(conf eq);
或者你可以简单地创建一个BaseCore构造函数,它接受一些枚举来表示你的实现,然后在BaseCore构造函数中初始化相应类的实例。
或者你可以通过实现BaseCore with Generic参数来实现它,并通过这些参数提供配置和设备管理器实现。您仍然可以使用相同的接口,但实现BaseCore对Generic参数的限制。 BaseCore看起来像这样:
class BaseCore<Configuration_type,Equipmentmanager_type>
where Configuration_type : IConfiguration, new()
where Equipmentmanager_type : IEquipmentmanager, new()
{
public Configuration_type Configuration {get;};
public Equipmentmanager_type Equipmentmanager {get;};
BaseCore()
{
Configuration = new Configuration_type();
Equipmentmanager = new Equipmentmanager_type();
}
}
然而,这会将约束放在他们需要无参数构造函数的类型上。据说可以在之后进行初始化。
如果您想为特定配置专门化您的核心,您可以像这样继承它
class Acore<Configuration_type,Equipmentmanager_type> :
BaseCore<Configuration_type,Equipmentmanager_type>
where Configuration_type : AConfiguration ,new()
where Equipmentmanager_type : AEquipmentmanager, new()
{
Acore() : base()
{
Configuration.intprop = 10;
}
}
请注意,我在AConfiguration上添加了一个在BaseCore中无法访问但在ACore中的属性