方法重载的替代方法C#

时间:2018-07-20 13:51:44

标签: c#

实现采用不同类型的类对象的方法的最佳方法是什么?

我有一个功能:

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
        }

犯同样的事情

3 个答案:

答案 0 :(得分:1)

摘要:我将使用strategy patternabstract 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