我是一名非常新的程序员,了解到我们需要尽量减少代码冗余,这样在更新时就能尽可能减少更改并最小化错误。
因此,我有一个学生类,我想要重载构造函数,这样如果我进行回溯,就像这样。
public class Student
{
string name;
int Id;
public Student()
{
}
public Student(string name)
{
this.name = name;
}
public Student(string name, int Id) :this(name)
{
this.Id = Id;
但是这显然不好,因为我们想要将所有的代码放在一个构造函数中,原因是什么呢?易读性吗?
public Student() : this(null, 0)
{ }
public Student(string name) : this(name, 0)
{ }
public Student(string name, int Id)
{
this.name = name;
this.Id = Id;
}
如果我使用正向链接,那么如果我们添加一个新的字段如字符串专业,会发生什么?如果我使用正向链接,则需要创建一个带有添加字段的新重载构造函数。但现在我必须更改所有其他构造函数以调用新的构造函数。如果我使用反向链接,我只需创建一个新的构造函数并调用先前的重载函数即可。
public Student(string name, int Id, string major):this(name, Id)
{
this.major=major;
}
这似乎更符合面向对象编程的规范,但我教材中的所有示例都展示了正向链接,并没有说明为什么我不应该使用反向链接。
如果我使用命名/可选参数,那就更容易了。
public Student(string name = null, int Id = 0, string major = null)
{
this.name = name;
this.Id = Id;
this.major = major;
}
如果我需要另一个字段,只需要编辑唯一的构造函数。这似乎最符合面向对象编程原则,或者我错了吗?至少它可以消除最多的代码重复。我的任务是“按照面向对象编程原则实现学生类”。我知道所有这些都是有效的,但是有一种方式是最好/被接受的构造函数编码方式吗?我是否忽略了命名/可选参数的缺点?对于初学者来说,这么多编码方式非常令人困惑。
public Student() : this(null) {}
而不是public Student() : this(null, 0) {}
。(如果您有两个接受单个可空参数的构造函数,则可能会变得模糊不清)。这样,当您添加新字段时,您只需要更改链中的最后一个构造函数即可。 - Ted Hopp