【问题标题】:Is there are a convention for the order of arguments in a constructor, especially for subclasses?构造函数中的参数顺序是否有约定,尤其是对于子类?
【发布时间】:2014-03-11 11:10:20
【问题描述】:

这似乎是一个奇怪的问题,但是关于如何在构造函数中排序参数,特别是在子类中添加构造函数“获得”的参数的位置是否有约定?在我发现自己阅读了这样的代码之后,在我看来应该有一个(代码是 Groovy,但这与问题无关):

class Matter {
    double volume
    double mass

    Matter (double m, double v) {
        mass = m; volume = v;
    }
}

class Food extends Matter {
    double nutrition

    Food (double m, double v, double n) {
        super (m,v); nutrition = n;
    }
}

class Apple extends Food {
    double sweetness

    Apple (double s, double m, double v, double n) {
        super (m,v,n); sweetness = s;
    }

}

class GreenApple extends Apple {
    double acidity

    GreenApple (double a, double m, double n, double s, double v) {
        super (s,m,v,n); acidity = a;
    }
}

正如我上面所说明的,一旦我们到达 GreenApple,构造函数参数中可能曾经存在的任何顺序都消失了。但是请注意,程序员并没有随机添加他们的新参数——Food 的作者认为应该在后面添加新参数,Apple 的作者认为应该在前面添加它们,GreenApple 的程序员认为参数应该按字母顺序排序,但是在一起,它们使构造函数相当混乱(类型安全在这里没有用,这些都是双精度的)。

巧合(好吧,不是真的),这也是我认为可能存在的三个约定。所以,我现在的问题是,是否有这样的约定,如果有,它是什么?语言之间有区别吗?

【问题讨论】:

    标签: inheritance constructor conventions cross-language


    【解决方案1】:

    据我所知,没有任何“硬”约定,例如按字母顺序对参数进行排序或类似的东西。恕我直言,构造函数或任何函数中的参数应该从最重要到最不重要进行排序。当然,这有待解释,但这不是团队成员之间良好沟通无法解决的问题。

    确实,在大多数情况下,如果子类仍然需要从外部传递,我希望子类不会重新排序构造函数参数。但是可能有非常正当的理由可以例外。

    【讨论】:

      猜你喜欢
      • 2013-10-25
      • 2014-04-23
      • 2010-12-23
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多