如果只需要一个小的改变,如何在不复制整个方法的情况下实现重载

本文关键字:复制 重载 实现 情况下 方法 改变 如果 一个 | 更新日期: 2023-09-27 18:04:23

考虑使用这些方法(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);
        }

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

如果只需要一个小的改变,如何在不复制整个方法的情况下实现重载

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

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

在c#中你可以使用带有默认值的可选参数:

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

And可以这样使用:

int a = Multiply(2, 3);    // 2 * 3 * 1 = 6
int b = Multiply(2, 3, 4); // 2 * 3 * 4 = 24

如果一个调用调用被简化为另一个带有适当参数的更一般的调用,那么这是首选选项。(参见Inisheer和Jeremy Thompson的建议)。

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

类似于

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
    }

你可以用带变量参数的方法覆盖它。由于已有的方法涵盖了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);
    }
}