Наследование (inheritance). Компьютерные технологии (программирование на C#)
Теперь убедитесь, что конструктор базового класса вызывается всегда, когда вызывается конструктор наследника. С этой целью конструктор базового класса _1 (файл библиотеки LibCode) перепишите так, чтобы он имел вид. Смысл этого комментария в том, что базовым классом (или, предком) класса LibClasses._1 является класс object и его конструктор с тем же именем object вызывается каждый раз при вызове… Читать ещё >
Наследование (inheritance). Компьютерные технологии (программирование на C#) (реферат, курсовая, диплом, контрольная)
Вернемся к проекту MainExe, к описанию класса _2. В методе Main добавьте строку.
LibClasses._1.
В этой точке IntelliSense покажет список, состоящий из двух статических методов Equals и ReferenceEquals. Другими словами, класс LibClasses._1 содержит два статических метода с указанными именами. Но откуда эти методы? Ни один из них явно не описывался в классе LibClasses._1!
Замените добавленную строку другой.
string.
На этот раз IntelliSense покажет более длинный список статических членов класса System.String. Среди них есть те же два метода Equals и ReferenceEquals, что и у класса LibClasses._1.
Попробуйте еще строку.
double.
Теперь будет отображен список статических членов класса System. Double и в нем встретятся те же два метода Equals и ReferenceEquals.
Одним из важнейших качеств объектно-ориентированного подхода в программировании является способность классов наследовать код других классов. Класс-наследник (derived class) может наследовать любые члены класса-предка (base class) — методы, поля и т. д. Это означает, что класс-наследник использует наследуемые члены класса-предка, как свои собственные.
В языке C# каждый класс может иметь не более одного класса-предка. Но у класса-предка может быть свой предок и т. д. В основе всех классов, используемых в .NET, лежит один общий предок — класс System.Object. Прямым предком описанного нами класса LibClasses._1 является именно класс System.Object. Псевдонимом класса System. Object является служебное слово object.
Наследование и вызов конструктора Еще раз рассмотрим класс _2 и действие в нем оператора.
static LibClasses._1 inst1 = new LibClasses._1();
Установите каретку в область текста этого оператора. Дайте команду отладчика Run To Cursor (например, из контекстного меню). После того, как отладчик выделит строку с этим оператором, поместите указатель мышки на имя _1 конструктора класса LibClasses._1, стоящего после оператора new. Тогда получите информацию вида.
+LibClasses._1|LibClasses._1.
Указав на +, получите еще один комментарий.
base {object}|object.
Смысл этого комментария в том, что базовым классом (или, предком) класса LibClasses._1 является класс object и его конструктор с тем же именем object вызывается каждый раз при вызове конструктора LibClasses._1.
Чтобы убедиться в этом лишний раз, добавьте в пространстве имен LibClasses библиотечного файла LibCode новый класс _1Der с описанием.
public class _1Der: _1.
{.
}.
Это будет класс _1Der — наследник класса _1. Класс _1Der пуст. Но, по умолчанию, имеет конструктор с тем же именем и без параметров. Чтобы увидеть это, добавьте в классе _2 после строки.
static LibClasses._1 inst1 = new LibClasses._1();
строку.
static LibClasses._1Der inst_1Der = new LibClasses._1Der ();
Так будет описан и создан экземпляр класса _1Der, наследующего класс _1.
Установите каретку в область текста этого оператора. Дайте, как и раньше, команду отладчика Run To Cursor (из контекстного меню). После того, как отладчик выделит строку с этим оператором, поместите указатель мышки на имя _1Der конструктора класса LibClasses._1Der, стоящего после оператора new. Тогда получите информацию вида.
+LibClasses._1Der|LibClasses._1Der.
Указав на +, получите комментарий о базовом классе.
+base {LibClasses._1}|LibClasses._1.
Вновь указав на +, получите новый комментарий.
base {object}|object.
Теперь убедитесь, что конструктор базового класса вызывается всегда, когда вызывается конструктор наследника. С этой целью конструктор базового класса _1 (файл библиотеки LibCode) перепишите так, чтобы он имел вид.
public _1().
{.
System.Console.WriteLine («Base constructor»);
}.
После этого активизируйте проект. В черном окне дважды должна появиться строка Base constructor.
Это связано с тем, что конструктор класса _1 вызывается дважды — строкой кода.
static LibClasses._1 inst1 = new LibClasses._1();
в классе _2, и следующей за ней строкой кода.
static LibClasses._1Der inst_1Der = new LibClasses._1Der ();
Последняя строка создает экземпляр inst_1Der класса-наследника _1Der. Но при этом конструктор класса _1Der вызывает неявно конструктор своего предка, или базового класса _1. Проверьте ход выполнения кода с помощью команд отладчика Run To Cursor и Step Into.