0

考虑这些方法(int用作参数输入以简化示例。但它可以是任何数据类型,并且不能相同)

        public int Multiply(int a, int b)
        {
            int c=1;
            return (a * b * c);
        }
        public int Multiply(int a, int b, int c)
        {
            return (a * b * c);
        }

假设这些方法写得很长,那我怎么能避免复制完整的方法呢?

4

5 回答 5

4

重载的方法可以相互调用,因此您可以通过扩展功能来避免复制完整的方法,例如:

public int Multiply(int a, int b)
{
        return Multiply(a,b,1);
}
public int Multiply(int a, int b, int c)
{
        return (a * b * c);
}
于 2013-03-17T05:46:14.427 回答
3

在 C# 中,您可以使用带有默认值的可选参数:

public int Multiply(int a, int b, int c = 1)
{
     return (a * b * c);
}

并且可以像这样使用:

int a = Multiply(2, 3);    // 2 * 3 * 1 = 6
int b = Multiply(2, 3, 4); // 2 * 3 * 4 = 24
于 2013-03-17T05:52:54.307 回答
2

就像是 :

private static int Multiply(params int[] nums)
{
    int result = 1;
    foreach (int num in nums)
    {
        result *= num;
    }
    return result;
}

上面的方法可以用Linq写

private static int Multiply(params int[] nums)
{
    return nums.Aggregate(1, (current, num) => current*num);
}

例子 :

    public static void Main()
    {
        int ans1 = Multiply(1, 2, 3, 4);         // 24
        int ans2 = Multiply(1, 2, 3, 4, 5);      // 120
        int ans3 = Multiply(1, 2, 3, 4, 5, 6);   // 720

    }
于 2013-03-17T05:50:17.183 回答
2

如果将一个调用缩减为具有适当参数的另一个更通用的调用,那么这是首选选项。(参见 Inisheer 和 Jeremy Thompson 的建议)。

然而,在一般情况下,如果无法做到这一点,我建议将大型操作分解为更小的有意义的操作。这样,可以在子类中实现不同的操作变体,而无需重复太多代码。

于 2013-03-17T06:00:58.960 回答
1

好吧,您可以使用带有 varg 参数的方法覆盖它。由于已经可用的方法涵盖了 2 和 3 参数,因此可以使用 1、2、3 来表示任意数量的输入。

这是一个示例代码,它重用了重载方法。

代码

/**
 * @author Sudhakar Duraiswamy
 *
 */
public class Reuse {

    public static void main(String[] args) {
        Reuse r = new Reuse();
        int[] rr = {1,2,3};

        System.out.println(r.Multiply(rr));

        int[] rr1 = {1,2,3,3};
        System.out.println(r.Multiply(rr1));

        int[] rr2 = {1,2,3,3,2};
        System.out.println(r.Multiply(rr2));
    }

    public int  Multiply(int... arg){
        int result = 1;
        if(null != arg && arg.length >0){

            if(arg.length ==1){
                result =  arg[0];
            }else if(arg.length ==2){

                result =  Multiply(arg[0],arg[1]);
            }else if(arg.length >=3){               
                int remainingSize  = arg.length % 3;

                for(int i=0;i< arg.length-remainingSize ;i= i+3){                   
                    result = result * Multiply(arg[i], arg[i+1], arg[i+2]);                 
                }

                if(remainingSize == 2){             
                    result =result * Multiply(arg[arg.length-2], arg[arg.length-1]);
                }else if(remainingSize == 1){
                    result = result * arg[arg.length-1];
                }
            }
        }

        return result;
    }

    public int Multiply(int a, int b)
    {
        int c=1;
        return (a * b * c);
    }
    public int Multiply(int a, int b, int c)
    {
        return (a * b * c);
    }
}
于 2013-03-17T07:13:01.603 回答