Вопрос№29.Деструкторы класса 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Вопрос№29.Деструкторы класса



Если задача создания объектов полностью возлагается на программиста, то задача удаления объектов,после того, как они стали не нужными, в Visual Studio.Net снята с программиста и возложена на соответствующий инструментарий - сборщик мусора. Так же, как и статический конструктор, деструктор класса, если он есть, вызывается автоматически в процессе сборки мусора. Его роль - в освобождении ресурсов, например, файлов, открытых объектом.Деструктор C# фактически является финализатором (finalizer), с которыми мы еще встретимся приобсуждении исключительных ситуаций. Приведу формальное описание деструктора класса Person:Person(){ //Код деструктора}Имя деструктора строится из имени класса с предшествующим ему символом ~ (тильда). у деструктора не указывается модификатор доступа.Конструкторы класса.Конструктор - неотъемлемый компонент класса. Нет классов без конструкторов. Конструктор представляет собой специальный метод класса, позволяющий создавать объекты класса. Одна из синтаксических особенностей этого метода в том, что его имя должно совпадать с именем класса. Если программист не определяет конструктор класса, то к классу автоматически добавляется конструктор по умолчанию - конструктор без аргументов. Заметьте, что если программист сам создает один или несколько конструкторов, то автоматического добавления конструктора без аргументов не происходит.Как и когда происходит создание объектов? Чаще всего, при объявлении сущности в момент ее инициализации. Давайте обратимся к нашему последнему примеру и рассмотрим создание трех объектов класса Person:Person pers1 = new Person(), pers2 = new Person();Person pers3= new Person("Петрова");Сущности pers1, pers2 и pers3 класса Person объявляются с инициализацией, задаваемой унарной операцией new, которой в качестве аргумента передается конструктор класса Person. У класса может быть несколько конструкторов - это типичная практика,- отличающихся сигнатурой. В данном примере в первой строке вызывается конструктор без аргументов, во второй строке для сущности pers3 вызывается конструктор с одним аргументом типа string. Разберем в деталях процесс создания:первым делом для сущности pers создается ссылка, пока висячая, со значением null;затем в динамической памяти создается объект - структура данных с полями, определяемыми классом Person. Поля объекта инициализируются значениями по умолчанию: ссылочные поля -значением null, арифметические - нулями, строковые - пустой строкой. Эту работу выполняет конструктор по умолчанию, который, можно считать, всегда вызывается в начале процесса создания. Заметьте, если инициализируется переменная значимого типа, то все происходит аналогичным образом, за исключением того, что объект создается в стеке;если поля класса проинициализированы, как в нашем примере, то выполняется инициализация полей заданными значениями;если вызван конструктор с аргументами, то начинает выполняться тело этого конструктора. Как правило, при этом происходит инициализация отдельных полей класса значениями, переданными конструктору. Так, поле fam объекта pers3 получает значение "Петрова"; На заключительном этапе ссылка связывается с созданным объектом.Процесс создания объектов становится сложнее, когда речь идет об объектах, являющихся потомками некоторого класса. В этом случае, прежде чем создать сам объект, нужно вызвать конструктор,создающий родительский объект. Но об этом мы еще поговорим при изучении наследования.(Ключевое слово new используется в языке для двух разных целей. Во-первых, это имя операции, запускающей только что описанный процесс создания объекта. Во-вторых, это модификатор класса или метода. Роль new как модификатора будет выяснена при рассмотрении наследования.) в зависимости от контекста и создаваемого объекта, может требоваться различная инициализация его полей. Перегрузка конструкторов и обеспечивает решение этой задачи.Немного экзотики, связанной с конструкторами. Конструктор может быть объявлен с атрибутом private Понятно, что в этом случае внешний пользователь не может воспользоваться им для создания объектов.Но это могут делать методы класса, создавая объекты для собственных нужд со специальной инициализацией. Пример такого конструктора будет дан позже.

 

Вопрос№30. Интерфейсы

интерфейс- это частный случай класса. Интерфейс представляет собой полностью абстрактный класс, все методы которого абстрактны. От абстрактного класса интерфейс отличается некоторыми деталями в синтаксисе и поведении. Синтаксическое отличие состоит в том, что методы интерфейса объявляются без указания модификатора доступа. Отличие в поведении заключается в более жестких требованиях к потомкам.Класс, наследующий интерфейс, обязан полностью реализовать все методы интерфейса. В этом -отличие от класса, наследующего абстрактный класс, где потомок может реализовать лишь некоторые методы родительского абстрактного класса, оставаясь абстрактным классом. Но, конечно, не ради этих отличий были введены интерфейсы в язык C#. У них значительно более важная роль.Введение в язык частных случаев усложняет его и свидетельствует о некоторых изъянах, для преодоления которых и вводятся частные случаи. Например, введение структур в язык C# позволило определять классы как развернутые типы. Конечно, проще было бы ввести в объявление класса соответствующий модификатор, позволяющий любой класс объявлять развернутым. Интерфейсы позволяют частично справиться с таким существенным недостатком языка, как отсутствие множественного наследования классов. Хотя реализация множественного наследования встречается с рядом проблем, его отсутствие существенно снижает выразительную мощь языка. В языке C# полного множественного наследования классов нет. Чтобы частично сгладить этот пробел, допускается

множественное наследование интерфейсов. Обеспечить возможность классу иметь несколько родителей- один полноценный класс, а остальные в виде интерфейсов,- в этом и состоит основное назначение интерфейсов.Отметим одно важное назначение интерфейсов. Интерфейс позволяет описывать некоторые желательные свойства, которыми могут обладать объекты разных классов. В библиотеке FCL имеется большое число подобных интерфейсов, с некоторыми из них мы познакомимся в этой лекции. Все классы, допускающие сравнение своих объектов, обычно наследуют интерфейс IComparable, реализация которого позволяет сравнивать объекты не только на равенство, но и на "больше","меньше".Класс реализует методы интерфейса, делая их открытыми для клиентов класса и наследников. Другая стратегия реализации состоит в том, чтобы все или некоторые методы интерфейса сделать закрытыми.Для реализации этой стратегии класс, наследующий интерфейс, объявляет методы без модификатора доступа, что по умолчанию соответствует модификатору private, и уточняет имя метода именем интерфейса. Метод нтерфейса со своим именем закрывается, а потом открывается под тем именем, которое класс выбрал для него. Создать объект класса интерфейса обычным путем с использованием конструктора и операции new нельзя. Тем не менее, можно объявить объект интерфейсного класса и связать его с настоящим объектом путем приведения (кастинга) объекта наследника к классу интерфейса. Это преобразование задается явно. Имея объект, можно вызывать методы интерфейса - даже если они закрыты в классе,для интерфейсных объектов они являются открытыми. При множественном наследовании классов возникает ряд проблем. Они остаются и при множественном наследовании интерфейсов, хотя становятся проще. Рассмотрим две основные проблемы – коллизию имен и наследование от общего предка.наследники не должны требовать изменений своих родителей - они сами должны меняться.Переименование методов интерфейсов иногда невозможно чисто технически, если интерфейсы являются встроенными или поставляются сторонними фирмами. К счастью, мы знаем, как производить переименование метода интерфейса в самом классе наследника. для этого достаточно реализовать методы разных интерфейсов как закрытые, а затем открыть их с переименованием.Отношение порядка на объектах класса Person задается как отношение порядка на фамилиях персон.Так как строки наследуют интерфейс IComparable, то для фамилий персон вызывается метод CompareTo, его результат и возвращается в качестве результата метода CompareTo для персон. Если аргумент метода не будет соответствовать нужному типу, то выбрасывается исключение со специальным уведомлением.Введем теперь в нашем классе Person перегрузку операций отношения.

 

Вопрос№31.Делегаты. Делегат – это класс.Объявление класса делегата начинается ключ. словом delegate и выглядит следующим образом: ОбъявлениеКлассаДелегата::=[СпецификаторДоступа] delegate СпецификаторВозвращаемогоЗначения ИмяКлассаДелегата (СписокПараметров); При этом СпецификаторВозвращаемогоЗначения::= ИмяТипа ИмяКлассаДелегата::= Идентификатор а синтаксис эл-та СписокПараметров аналогичен списку параметров функции. Но сначала – примеры объявления классов делегатов: delegate int ClassDelegate(int key); delegate void XXX(int intKey, float fKey); Подобие объявления класса-делегата и заголовка функции не случайно. Класс-делегат способен порождать объекты. При этом назначение объекта — представителя класса-делегата заключается в представлении методов (функций-членов) РАЗЛИЧНЫХ классов. Любой класс-делегат наследует System.MulticastDelegate. Это обстоятельство определяет многоадресность делегатов: в ходе выполнения приложения объект-делегат способен запоминать ссылки на произвольное количество функций независимо от их статичности или нестатичности и принадлежности классам. Св-ва и методы классов-делегатов.1. Method — Возвращ. имя метода, на кот. указывает делегат.2. Target- Возвращает имя класса, если делегат указывает на нестатический метод класса. Возвращает знач-е типа null, если делегат указ-ет на статич. Метод. 3. Combine(), operator+(), operator+=(), operator–(), operator–=()- Фун-я и операторные функции. Обеспеч. реализацию многоадресного делегата. 4. GetInvocationList() -Основываясь на внутреннем списке ссылок на функции, строится соответствующий массив описателей типов функций. 5. object DynamicInvoke (object[]args) -В соответствии со списком ссылок обеспечивается выполнение функций, на которые был настроен делегат 6. static Remove()- Статич. метод, обеспеч. удаление эл-ов внутреннего списка ссылок на функции.



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 177; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.189.14.219 (0.006 с.)