Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky.rtf
Скачиваний:
27
Добавлен:
22.03.2016
Размер:
11.9 Mб
Скачать

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,

рассмотрим

нестатические

конструкторы

.

Соседние файлы в папке CSBasicCourse2ndedPodbelsky