如果只需要一个小的改变,如何在不复制整个方法的情况下实现重载
本文关键字:复制 重载 实现 情况下 方法 改变 如果 一个 | 更新日期: 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);
}
}