Прежде всего, почему мне нужно использовать xmlBook.Title = "XML Primer Plus"; вместо Book clrBook = new Book ("CLR via C #", ... ") и наоборот как конструкторы.
Вы можете поменять их, если хотите. Любой из вариантов работает, что и пытается продемонстрировать этот код.
Существует несколько конструкторов для класса Book
. Из кода вне класса (как в вашем Main
методе) вы можете вызывать любой конструктор класса, помеченный public
.
Причина, по которой вам нужно установить свойства при вызове new Book();
, заключается в том, что этот конструктор не устанавливает свойства класса. Когда вы вызываете new Book("CLR via C#", "Jeffrey", "Richter", etc);
, вы вызываете конструктор, который устанавливает для установки свойств.
Во-вторых, почему у меня не должно быть никаких параметров при использовании: base ()?
Базовый класс (Publication
) также имеет два конструктора. При вызове base()
вы вызываете конструктор Publication
, который не принимает параметров.
Когда вы вызываете конструктор для производного класса, всегда вызывается какой-то конструктор для базового класса. Если вы не укажете явно, какой из конструкторов базового класса вы хотите вызвать (вызывая base()
или base("some title", "some publisher name", 0.0f /* some price */)
), то по умолчанию будет вызван конструктор без параметров (т.е. public Publication()
).
В-третьих, как перезапись с использованием нового открытого void display () только добавляет вывод вместо полной модификации исходного защищенного void display ()? Я думаю, потому что оригинальный diplay () защищен?
Это не имеет ничего общего с тем, что оно защищено. Попробуйте изменить его на public
, и вы увидите то же поведение.
Способ, которым он «добавляет» поведение, заключается в том, чтобы фактически вызывать эту функцию в базовом классе. Строка base.display();
вызывает эту функцию. Если бы этой строки не было, функция базового класса была бы фактически «заменена».
Есть только одна вещь, которая означает protected
. Это означает, что вы не можете вызывать его из внешнего кода - вы можете вызывать его только из одного и того же класса (изнутри Publication
) и из производного класса (Book
). protected
не будет "защищать" его от переопределения в производных классах (с использованием override
или new
).