【问题标题】:C# better way for my Overload or Polymorphism重载或多态的 C# 更好的方法
【发布时间】:2013-10-30 16:43:30
【问题描述】:

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

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

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 个。

【问题讨论】:

  • 为什么不把相同的代码放在另一个函数中,然后从原始函数中调用呢?
  • 两种类型都派生自同一个基类吗?
  • 你也可以使用delegate来调用不同的代码部分
  • 如果两种类型都派生自同一个基类,为什么不直接使用inheritance
  • 理想情况下,这两种类型将实现一个接口,该接口定义了它们之间的共同行为,或者至少定义了此方法所需的行为。

标签: c# oop polymorphism overloading


【解决方案1】:

试试这个,假设 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>
}

【讨论】:

    【解决方案2】:

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

        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】:

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

      function(object input)
      {
        if (input is TypeA)
        {
      
        }
        else if (input is TypeB)
        {
        }
      }
      

      【讨论】:

        【解决方案4】:

        假设TypeATypeB 两种类型都派生自同一个基类,然后将您的函数参数泛化为基类型,然后根据类型对“不同”的部分有条件逻辑,这将允许一种处理两种类型的方法,如下所示:

        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
            }
        }
        

        【讨论】:

          【解决方案5】:

          正如 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
          }
          

          希望对您有所帮助。

          【讨论】:

            【解决方案6】:

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

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

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-10-15
              • 1970-01-01
              • 2011-07-23
              • 1970-01-01
              • 2010-10-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多