- •Глава 10, описывающая классы как контейнеры их статических членов,
- •Глава 13 посвящена отношениям между классами (и их объектами). Особое
- •Глава 18 включена в книгу при подготовке второго издания. Она посвящен
- •Глава 1. Объектная ориентация программ
- •1.1. Типы, классы, объекты
- •1.2. Программа на c#
- •1.3. Пространство имен
- •1.4. Создание консольного приложения
- •Глава 2. Типы в языке c#
- •2.1. Типы ссылок и типы значений
- •2.2. Классификация типов c#
- •2.3. Простые типы. Константы-литерал
- •2.4. Объявления переменных и констант базовых типо
- •If implicit in int interface
- •Internal is lock long namespace
- •Volatile while
- •Глава 3. Операции и целочисленные выражения
- •3.1. Операции языка c#
- •3.2. Операции присваивания и оператор
- •3.4. Выражения с арифметическими операциями
- •3.6. Переполнения при операциях с целыми
- •Глава 4. Выражения с операндами базовых
- •4.1. Автоматическое и явное приведение арифметических типов
- •4.2. Особые ситуации в арифметических выражениях
- •4.3. Логический тип и логические выражения
- •4.4. Выражения с символьными операндами
- •4.5. Тернарная (условная) операция
- •Глава 5. Типы с# как классы платформы .Net
- •5.1. Платформа .Net Framework и спецификация cts
- •5.2. Простые (базовые) типы c# как классы
- •5.3. Специфические методы и поля простых типов
- •Глава 6. Операторы
- •6.1. Общие сведения об операторах
- •6.2. Метки и оператор безусловного перехода
- •6.3. Условный оператор (ветвлений)
- •If (логическое выражение) оператор_1
- •6.4. Операторы цикла
- •6.5. Операторы передачи управления
- •If (условие) break;
- •6.6. Переключатель
- •Int ball; // оценка в баллах:
- •Глава 7. Массивы
- •7.1. Одномерные массивы
- •Int [ ] integers
- •Int number;
- •7.2. Массивы как наследники класса Array
- •7.3. Виды массивов и массивы многомерные
- •Int [,] dots;
- •Int size;
- •7.4. Массивы массивов и непрямоугольные массивы
- •Int size;
- •7.5. Массивы массивов и поверхностное копирование
- •Int size;
- •Int size;
- •Глава 8. Строки – объекты класса string
- •8.1. Строковые литералы
- •8.2. Строковые объекты и ссылки типа string
- •242.ToString()
- •8.3. Операции над строками
- •8.4. Некоторые методы и свойства класса String
- •8.5. Форматирование строк
- •8.6. Строка как контейне
- •8.7. Применение строк в переключателях
- •8.8. Массивы строк
- •8.8. Сравнение строк
- •Int static Compare (string, string)
- •Int static Compare (string, string, Boolean,CultureInfo)
- •If (string.Compare(res, hen, true,
- •8.9. Преобразования с участием строкового типа
- •38 Попугаев.
- •8.10. Аргументы метода Main( )
- •8.11. Неизменяемость объектов класса String
- •Глава 9. Методы c#
- •9.1. Методы–процедуры и методы-функции
- •9.2. Соотношение фиксированных параметров и аргументов
- •Int iPart;
- •9.3. Параметры с типами ссылок
- •Int[ ] temp;
- •Int[ ] temp;
- •9.4. Методы с переменным числом аргументов
- •VarParams(a, b, c);
- •9.5. Перегрузка методов
- •9.6. Рекурсивные методы
- •4*Fact (3); {
- •9.7. Применение метода Array.Sort()
- •Int имя_функции(тип параметр_1, тип параметр_2)
- •If(условие 2) return -1; // порядок соблюдён
- •Глава 10. Класс как совокупность статических
- •10.1. Статические члены класса
- •10.2. Поля классов (статические поля)
- •Int X; // поле объектов класса
- •10.3. Статические константы
- •10.4. Статические методы
- •10.5. Статический конструктор
- •10.6. Статические классы
- •Глава 11. Классы как типы
- •11.1. Объявление класса
- •11.2. Поля объектов
- •11.3. Объявления методов объектов
- •11.4. Пример класса и его объектов
- •Int count; // текущее показание
- •1 ' Counter.Count' is inaccessible due to its protection leve
- •11.5. Ссылка this
- •Int numb;
- •11.6. Конструкторы объектов класса
- •Int p; // порядок - инициализация по умолчанию
- •Void reduce() // Приведение числа к каноническому виду.
- •11.7. Деструкторы и финализаторы
- •Глава 12. Средства взаимодействия с объектами
- •12.1. Принцип инкапсуляции и методы объектов
- •12.2. Свойства классов
- •Internal, private, static, virtual, sealed, override, abstract, extern
- •Internal protected
- •Int p; // инициализация по умолчанию
- •Void reduce() // "Внутренний" для класса метод
- •12.3. Автореализуемые свойств
- •12.4. Индексаторы
- •Int[] days; // часы по дням недели
- •Int search(string str) { // поиск слова
- •12.5. Индексаторы, имитирующие наличие контейнера
- •Глава 13. Включение, вложение и наследование
- •13.1. Включение объектов классов
- •13.2. Вложение классов
- •13.3. Наследование классов
- •13.4. Доступность членов класса при наследовании
- •13.5. Методы при наследовании
- •13.6. Абстрактные методы и абстрактные классы
- •13.7. Опечатанные классы и методы
- •13.8. Применение абстрактых классов
- •Глава 14. Интерфейсы
- •14.1. Два вида наследования в ооп
- •14.2. Объявления интерфейсов
- •Interface имя_интерфейса
- •Interface iPublication { // интерфейс публикаций
- •Void write(); // готовить публикацию
- •Void read(); // читать публикацию
- •14.3. Реализация интерфейсов
- •Interface iPublication { // интерфейс публикаций
- •Void write(); // готовить публикацию
- •Void read(); // читать публикацию
- •Interface iSeries {
- •Void setBegin(); // восстановить начальное состояние
- •Int GetNext { get; } // вернуть очередной член ряда
- •Int this[int k] {get;} // вернуть к-й член ряда
- •Interface iSeries // интерфейс числовых рядов
- •14.4. Интерфейс как ти
- •Interface iGeo { // интерфейс геометрической фигуры
- •Void transform(double coef); // преобразовать размеры
- •Void display(); // вывести характеристики
- •Interface iGeo {
- •Void transform(double coef); // преобразовать размеры
- •Void display(); // вывести характеристики
- •Ira.Transform(3);
- •Ira.Transform(3);
- •14.5. Интерфейсы и наследование
- •Interface iPublication // интерфейс публикаций
- •Interface iBase
- •Interface iBase {
- •Глава 15. Перечисления и структуры
- •15.1. Перечисления
- •15.2. Базовый класс перечислений
- •IsDe fined"
- •15.3. Структуры
- •15.4. Упаковка и распаковка
- •If (obj is Struct1)
- •If (ob is PointS)
- •If (ob is Double)
- •15.5. Реализация структурами интерфейсов
- •Interface iShape {
- •Interface iShape
- •Information(ci);
- •Information(sp);
- •Interface iImage {
- •Void display();
- •Interface iImage
- •Void display();
- •Глава 16. Исключения
- •16.1. О механизме исключений
- •16.3. Свойства исключений
- •16.4. Управление программой с помощью исключений
- •X; // Вводимое число.
- •16.5. Исключения в арифметических выражениях
- •16.6. Генерация исключений
- •If (!double.TryParse(input, out u))
- •If (!double.TryParse(input, out u)
- •16.7. Пользовательские классы исключений
- •Глава 17. Делегаты и события
- •17.1. Синтаксис делегатов
- •17.2. Массивы делегатов
- •Int X, y; // положение робота на плоскости
- •17.3. Многоадресные (групповые) экземпляры делегатов
- •Virtual
- •17.4. Делегаты и обратные вызовы
- •17.5. Анонимные методы
- •17.6. События
- •Int size; // размер массива
- •Int[ ] ar; // ссылка на массив
- •Int temp;
- •Глава 18. Обобщения
- •18.1. Обобщения как средство абстракции
- •18.2. Декларации обобщённых классов "декларация
- •18.3. Ограничения типизирующих параметров
- •Intemface iComparable {
- •Int CompareTo (object p);
- •18.4. Обобщённые структуры "обобщённые структуры"
- •18.5. Обобщённые интерфейсы "обобщённый интерфейс"
- •Int add(t X, t y); // прототип метода
- •18.6. Обобщённые методы "обобщённые методы"
- •18.7. Обобщённые делегаты "обобщённые делегаты"
- •Virtual
- •InnerException
- •Interface
1 ' Counter.Count' is inaccessible due to its protection leve
l
11.5. Ссылка this
Нестатические методы класса отличаются от статических наличием в первых
ссылки this "ссылки this" . Эта ссылка позволяет нестатическому методу "узнать",
для какого объекта метод вызван и выполняется в данный конкретный момент.
Значением ссылки this является ссылка на тот объект, обработка которого
выполняется. Ссылку this нельзя и нет необходимости определять – она всегда
автоматически включена в каждый нестатический метод класса и она связана с тем
объектом, для которого метод вызывается. Иногда ссылку this называют
дополнительным параметром нестатического метода. Этот параметр представляет в
методе вызвавший его объект. Можно назвать следующие четыре вида возможных
применений ссылки this.
Для избежания конфликта имён между параметрами метода и членами объекта.
Для организации связей между объектами одного класса.
Для обращения из одного конструктора класса к другому конструктору того же
класса.
Для определения расширяющего метода (см [12] – стр. 1360; [1]).
Продемонстрируем первые две названные возможности применения ссылки
this на следующем примере.
Определим класс Link, объекты которого можно объединять в цепочку – в
односвязный список. Начало списка, то есть ссылку на первый объект, включённый
в список, представим статическим полем класса (static Link beg). Когда список пуст
значением beg будет null.
Программа с указанным классом:
// 11_05.cs - this и связный список
using System;
class Link
{
static Link beg;
Link next;
Int numb;
public void add(int numb)
{
this.numb = numb;
if (beg == null) // список пуст
{ beg = this; return; }
Link temp = beg;
while (temp.next != null)
temp = temp.next;
temp.next = this;
}
static public void display()
{
Link temp = beg;
while (temp != null)
{
Console.Write(temp.numb + " ");
temp = temp.next;
}
Console.WriteLine();
}
}
class Program
{
static void Main()
{
Link a = new Link(), b = new Link(), c = new Link();
a.add(7);
b.add(-4);
c.add(0);
Link.display();
}
}
Результат выполнения программы:
7 -4 0
Нестатическими полями класса являются int numb и Link next. Первое поле
нужно нам только для иллюстрации, значением второго поля будет ссылка на
следующий
объект,
подключённый
к
списку
вслед
за
рассматриваемым.
Последовательность формирования списка из объектов класса Link можно показать
на рисунке.
Пустой список: beg=null
numb next
7
nul
l







1 элемент:
beg
numb next
numb next
2 элемента:
beg
Рис.11.1. Формирование списка объектов
Для создания объектов класса Link в программе использован конструктор без
параметров, который автоматически встраивается в класс, когда в нём нет явно
определённых конструкторов.
Для "подключения" объекта к списку введён нестатический открытый метод:
public void add(int numb)
{
this.numb = numb;
if (beg == null) // список пуст
{ beg = this; return; }
Link temp = beg;
while (temp.next != null)
temp = temp.next;
temp.next = this;
}
Особенность метода – имя его параметра совпадает с именем поля класса.
Полное (квалифицированное) имя this.numb относится только к полю объекта.
Первое действие метода – присваивание полю this.numb значения параметра с тем
же именем. Применение ссылки this позволяет отличать поле объекта, для которого
вызван метод add(), от одноимённого параметра.
По умолчанию статическое поле Link beg и нестатическое поле Link next
инициализируются значениями null. Пока список пуст поле beg сохраняет это
пустое значение. Полю beg присваивается ссылка на первый объект класса Link, для
которого будет вызван метод add(). Если в списке уже есть элементы (объекты
класса Link), то создаётся локальная переменная Link temp, инициализированная
значением ссылки beg. Далее в цикле перебираются все элементы списка пока не
|
7 |
|
|
-4 |
null |
будет найден элемент, которому никакой объект не подключён. Его полю, доступ к
которому обеспечивает квалифицированное имя temp.next, присваивается значение
ссылки this, т.е. ссылка на очередной объект класса Link, для которого вызван
метод add().
Для последовательного перебора элементов списка и вывода значений полей
numb определён статический метод:
static public void display()
{
Link temp = beg;
while (temp != null)
{
Console.Write(temp.numb+" ");
temp = temp.next;
}
Console.WriteLine();
}
В теле метода цикл, в котором локальная переменная temp (ссылка на объекты
класса Link) последовательно адресует объекты списка, начиная с того, который
ассоциирован со статической переменной beg.
Для иллюстрации возможностей класса Link в классе Program определён
метод Main():
static void Main()
{
Link a = new Link(), b = new Link(), c = new Link();
a.add(7);
b.add(-4);
c.add(0);
Link.display();
}
Если в классе определены несколько нестатических конструкторов, то
зачастую удобно из одного конструктора обращаться к другому. Эту возможность,
как отмечено ранее, обеспечивает применение ссылки this. Перед тем, как
рассмотреть
эту
роль
служебного
слова
this,
рассмотрим
нестатические
конструкторы
.
