Я очень новичок в программировании и понимаю, что мы хотим минимизировать избыточность кода, поэтому при обновлении мы можем вносить как можно меньше изменений, а также минимизировать ошибки.
Итак, у меня есть класс Student, в котором мне нужен перегруженный конструктор, поэтому, если я сделаю обратную цепочку, это будет так.
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;
}
Если я сделаю эту прямую цепочку, то что произойдет, если мы добавим новое поле, например, string major? Если я использую прямую цепочку, я создаю новый перегруженный конструктор с добавленным полем. Но теперь мне нужно изменить все остальные конструкторы, чтобы вызвать новый. Если я выполняю обратную цепочку, я просто создаю новый конструктор и вызываю предыдущий перегруженный.
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) {}
. (Хотя это может стать неоднозначным, если у вас есть два конструктора, которые принимают один аргумент, допускающий значение NULL). Таким образом, вам нужно будет изменить только последний c'tor в цепочке при добавлении нового поля. - person Ted Hopp   schedule 02.06.2016