C#更好的方式为我的过载或多态

时间:2013-10-30 16:43:31

标签: c# oop polymorphism overloading

我正在尝试编写更好的代码。

我有一个函数处理两种不同类型的输入,函数很长并且两种类型之间只会有很小的区别。 目前我写的是这样的:

function(typeA  inputs)
{
......
......
<lots of same code>
......
......

<small different code part>
}


function(typeB  inputs)
{
......
......
<lots of same code>
......
......

<small different code part>
}

我想知道有没有更好的方法,我不需要放这么多重复的代码, 也许只写一个函数可以切换类型...

typeA和typeB是不同的基类。

目前A有5个项目,B有3个。

6 个答案:

答案 0 :(得分:3)

尝试此操作,假设typeAtypeB都从BaseType基类(或接口)继承:

SharedFunction(BaseType inputs)
{
    ......
    ......
    <lots of same code>
    ......
    ......
}

FunctionA(typeA  inputs)
{
    SharedFunction(inputs)

    <small different code part>
}

FunctionB(typeB  inputs)
{
    SharedFunction(inputs)

    <small different code part>
}

答案 1 :(得分:0)

假设两个类型TypeATypeB都派生自相同的基类,那么将您的函数参数推广到基类型,然后为不同的&#34;不同的部分提供条件逻辑;根据类型,这将允许一种方法来处理这两种类型,如:

function(typeBase inputs)
{
    ......
    ......
    <lots of same code>
    ......
    ......

    if(inputs is TypeA)
    {
       // Do stuff here for TypeA
    }
    else if(inputs is TypeB)
    {
       // Do stuff here for TypeB
    }
}

答案 2 :(得分:0)

假设这些方法都在同一个类中(所以没有基类),我会考虑使用Action of Func作为初始方法的参数,如下所示:

    public void Method(Action execute)
    {
        // Do stuff here...

        execute.Invoke();
    }

    public void SubMethod1()
    {
        // Does stuff
    }

    public void SubMethod2()
    {
        // Does different stuff
    }

然后您可以像这样调用方法:

Method(SubMethod1);
Method(SubMethod2);

答案 3 :(得分:0)

正如Karl所提到的,如果TypeA和TypeB派生自同一个类,那么只需使用基类作为参数类型。如果没有,我将创建一个简单的接口,然后从中派生TypeA和TypeB,并将接口作为参数类型传递。

public interface IMyType
{ 
// Properties you need both types to have
// Methods/Functions you need both types to have
}

然后,做

function(IMyType obj)
{
// Logic
}

希望有所帮助。

答案 4 :(得分:0)

您可以使用更通用的类型或父类型。 例如,

function(object input)
{
  if (input is TypeA)
  {

  }
  else if (input is TypeB)
  {
  }
}

答案 5 :(得分:0)

如果您的代码很简单,只需创建一个新函数来执行重复工作并调用它两次(如Karl所做的那样)。

如果您希望自定义类(例如,您正在编写框架并希望让用户为他们可能拥有的新类型指定不同的行为),则应考虑使用模板方法模式,其中特定于方法由子类定义(并且您使用多态/重载)。您可以使用继承轻松自定义类。

http://en.wikipedia.org/wiki/Template_method_pattern

如果问题更复杂,您可以使用策略模式,其中整个算法在另一个类中定义:

http://en.wikipedia.org/wiki/Strategy_pattern