参数传递给类'构造函数的顺序是否一致?

本文关键字:是否 顺序 构造函数 参数传递 | 更新日期: 2023-09-27 17:50:45

我想知道在定义将参数传递给第一个类的构造函数的派生类的构造函数签名时,首先或最后传递基类构造所需的参数是否是一个好做法:

public class Base
{
    private Type1 _t1;
    private Type2 _t2;
    Base(Type1 t1, Type2 t2)
    {
        _t1 = t1;
        _t2 = t2;
    }
}

选项1:

public class Derived : Base
{
    private Type3 _t3;
    private Type4 _t4;
    // Base class arguments first in the signature
    public Derived(Type1 t1, Type2 t2, Type3 t3, Type4 t4) : Base(t1, t2)
    {
        _t3 = t3;
        _t4 = t4;
    }
}

选项2:

public class Derived : Base
{
    private Type3 _t3;
    private Type4 _t4;
    // Derived class arguments first in the signature
    public Derived(Type3 t3, Type4 t4, Type1 t1, Type2 t2) : Base(t1, t2)
    {
        _t3 = t3;
        _t4 = t4;
    }
}

虽然我知道这对编译器没有任何影响,但在良好的编程实践中有什么说的吗?如果有的话,哪种方法是首选的?

参数传递给类'构造函数的顺序是否一致?

这个问题是假的,因为你在用错误的术语思考。你把Derived看作是Base和别的东西。你应该把Derived看作是Base的替代品。Derived的构造函数形参是派生类型的形参,Base的构造函数接受什么实参是完全无关的。现在的问题是,Derived的参数t1, t2, t3…的正确顺序是什么?

调用者不需要也不应该知道你是如何初始化Base的,他们只知道如何参数化Derived

FWIW。我同意这种说法。完全基于个人观点。然而。Notation-wise。和个人。在涉及数字的情况下(如您的示例),保持数字顺序(升序或其他)是一个很好的经验法则。所以。

t1, t2, t3, t4 ... 
不是

t3, t4, t1, t2 ...

我认为这里唯一重要的是您是否可以在派生类中具有可选参数的构造函数。例如:

public class Derived : Base
{
    private static Type4 DEFAULT_T4_VALUE = something;
    private Type3 _t3;
    private Type4 _t4;
    // Base class arguments first in the signature
    public Derived(Type1 t1, Type2 t2, Type3 t3, Type4 t4 = null) : Base(t1, t2)
    {
        _t3 = t3;
        if (t4 == null) _t4 = DEFAULT_T4_VALUE;
        else _t4 = t4;
    }
}