如何处理2个几乎相同的构造函数[重复]

Posted

技术标签:

【中文标题】如何处理2个几乎相同的构造函数[重复]【英文标题】:How to deal with 2 almost identical constructors [duplicate] 【发布时间】:2013-08-14 01:18:33 【问题描述】:

如果我的自定义类中有 2 个构造函数,其中一个接受一个额外的参数并完成第一个所做的所有事情,但只增加一行代码(并且这一额外的行使用了额外的参数),如何最好地处理无需复制第一个构造函数中的所有代码?

示例代码

public myConstuctor(int number, int number2)

    int result = (number + number2);
    int result2 = (number2 - number1)

    //Etc
    //Etc
    //Etc
    //Etc



public myConstructor(int number1, int number2, int number 3)

    int result = (number + number2);
    int result2 = (number2 - number1)

    //Etc
    //Etc
    //Etc
    //Etc

    int result3 = (result + result2 + number3)



【问题讨论】:

不,这不是同一个问题,我不是专门问如何从另一个构造函数调用一个构造函数,我是问如何处理减少重复代码的问题,不管最流行的答案可能就是这样做(从另一个调用一个构造函数) “我在问如何处理减少重复代码的问题,”你选择的是正确而不是正确的答案..最好将逻辑放在具有更多参数的构造函数中 @nachokk,如果我创建一个只需要 1 个参数的对象,那么它不需要 2 参数构造函数中的代码,所以我的大部分逻辑(所有常见逻辑)都在least 参数的构造函数,当我需要创建一个传递 2 个参数的对象时,仍然需要运行原始 1 参数构造函数中的所有逻辑,因为它对这种类型的所有对象都是通用的,但也需要2参数构造函数中的附加代码,我参考1参数构造函数并运行公共代码,然后在另一个中运行额外代码。看起来很合乎逻辑? 我想说的是,如果您按照@bas 建议的方式进行操作,您只需将逻辑放入一个构造函数中,另一方面您必须将逻辑放入两个构造函数中! @nachokk,不,我只有一个构造函数(单参数构造函数)中的大部分代码 - 我在另一个构造函数(2 参数构造函数)中的唯一代码是所需的代码需要它的对象,现在没有重复代码! :-) 【参考方案1】:

您可以调用另一个构造函数并将所有逻辑放在那里。

public myConstructor(int number, int number2)
    this(number, number2, 0);


public myConstructor(int number1, int number2, int number3)

    int result = (number + number2);
    int result2 = (number2 - number1)

    //Etc
    //Etc
    //Etc
    //Etc

    int result3 = (result + result2 + number3)



【讨论】:

如果 number3 乘以某个值怎么办?说result2 *= number3? 根据构造函数的结构,SLaks 的答案可能会更好。这种方法意味着用户可以使用 3 个参数调用myConstructor,但使用默认参数代替 number3。 @Math 在您的情况下,默认调用可能是 this(number, number2, 1); 我之所以这么说,是因为我认为您的解决方案将取决于构造函数的作用,而 Slaks 的回答在我看来涵盖了所有可能性。不是您的错误,而是取决于构造函数。 @Math 你是对的,但通常最好从具有较少参数的构造函数中调用具有更多参数的构造函数,因为通常需要或隐含缺少参数的默认值。 在封闭类中声明result,result2,result3作为局部变量而不是数据成员是非常没有意义的。【参考方案2】:

你可以让第二个构造函数调用第一个:

public MyClass(int number1, int number2, int number3) 
    this(number1, number2);

【讨论】:

嗯不知道为什么 5 票赞成,@bas 答案是正确的 完美。实施并工作得很好:-) @nachokk:两个答案都是正确的。我通常更喜欢让参数较少的构造函数调用参数较大的构造函数。 op 的案例以一种暗示这种排序可能不可能的方式呈现,因此 SLaks 采取了安全的路线并提供了一个与 OP 的代码更接近的答案。如果 number3 没有可能的默认值,则 bas 的答案不是一个选项(除非您添加哨兵值或使 number3 可为空)。有些人会争辩说 SLaks 的方法更简洁,因为它创建了许多小型构造函数,而不是一个巨大的构造函数)。 带有 3 个参数的构造函数几乎总是错误的。此时最好有一个 Map 以防在某些时候您必须向构造函数添加一个 number4,而不必更改构造函数的原型。【参考方案3】:

如果参数太多而无法管理,您也可以使用构建器模式:

MyClass obj = Myclass.set1(number1).setN2(number2).setN3(number3).build();

build() 可以调用繁琐的构造函数。

【讨论】:

+1 比使用 2 个构造函数更好的方法 这是Builder设计模式,是正确的使用方式。 感谢@rocketboy,这很有趣。我的实际类中最多只有 2 个参数(1 个参数构造函数和 2 个参数构造函数),所以我将使用 Slacks 答案,但是谢谢,我会调查一下!【参考方案4】:

只需在第二个构造方法中使用第一个构造方法,然后......只需在第二个构造方法中添加所需的新行。

public ClassName(arg1, arg2)
   //etc



public ClassName(arg1,arg2,arg3)
 this(arg1,arg2);
 //new line of code to deal with arg3;

就是这样 :) 节省了大量时间。

【讨论】:

您不能拥有具有不同名称的构造函数。它们必须与类名匹配。 CLASSNAME 未遵循命名规则最佳做法。应该是ClassName 你一定是在开玩笑,哈哈。 XD jajajaja 我们又去修复它

以上是关于如何处理2个几乎相同的构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

复制控制函数中如何处理 C++ 数组成员?

当我为此目的创建构造函数时,如何处理 Doctrine::find 未初始化未映射的实体属性?

数组②Array 构造函数

析构函数和构造函数

返回类构造函数的函数的类型声明

我该如何处理这个 C++ Multimap 问题?