实现采用不同类型的类对象的方法的最佳方法是什么?
我有一个功能:
public class WorkerService: IWorkerService
{
private readonly ISession _session;
private readonly IPeriodService _periodService;
private readonly IGService _gService;
private readonly IIntegrationService _integrationService;
public OutlookIntegrationWorkerService(...)
{
...
}
public enum emunType
{
Class1ToExport = 1,
Class2ToExport = 2,
}
public void somefunction(Guid id, IJobCancellationToken cancellationToken, emunType type)
{
if(type.Class1ToExport)
{
//do work
somefunction(classObject, IJobCancellationToken cancellationToken)
}else(type.Class2ToExport){
//do work
somefunction(differentClassObject, IJobCancellationToken cancellationToken)
}
private void somefunction(Class1 classObject, IJobCancellationToken cancellationToken)
{
//do work
}
private void somefunction(Class2 classObject, IJobCancellationToken cancellationToken)
{
//do the same work
}
}
}
公共无效somefunction(Guid id, IJobCancellationToken cancellationToken, emunType type)
用于多个不同的类,我使用enumType知道要使用哪种对象,我不想重载
private void somefunction(Class2 classObject, IJobCancellationToken cancellationToken)
{
//do the same work
}
犯同样的事情
答案 0 :(得分:1)
摘要:我将使用strategy pattern和abstract factory来创建策略。
详细信息:创建包含此方法的接口IClassExportStrategy
:
void Export(IJobCancellationToken cancellationToken);
此界面定义了所有策略将执行的操作。
对于每个要导出的ClassX
,创建一个ClassXExportStrategy
类,该类在构造函数中使用ClassX
的实例,并实现该接口。 (这些类是策略。)
现在创建一个类ClassExportStrategyAbstractFactory
。它有一种方法:
public IClassExportStrategy GetClassExportStrategy(object @object)
{
if(@object is class1)
{
return new Class1ExportStrategy(@object as Class1);
}
// repeat for other classes...
// Finally:
throw new NotImplementedExcepton(@object.GetType().FullName);
}
请注意,这意味着您不再需要枚举。
要使用它,只需调用抽象工厂的GetClassExportStrategy
并传递要导出的类的实例(这将返回相关策略),然后在其上调用Export
方法。
答案 1 :(得分:0)
为简单起见,您可以获取对象的Type并使用该对象:
public void somefunction(Guid id, IJobCancellationToken cancellationToken, Object classObject)
{
if(object is class1)
{
//do work
somefunction(classObject, IJobCancellationToken cancellationToken)
}else if(object is class2){
//do work
differentfunction(classObject, IJobCancellationToken cancellationToken)
}
}
这不是最优雅,然后我会按照艾米的建议使用泛型
答案 2 :(得分:0)
我的建议是将WorkerService声明为泛型和抽象的,将somefunction声明为泛型的抽象方法,并在派生类型中将Class1或Class2作为泛型值传递,如下所示:
doubleWord