Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция1-2.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
118.27 Кб
Скачать

Конструкторы классов

Конструктор это специальный метод класса, который вызывается автоматически при создании объекта класса. ВС#, как и в C++ имя конструктора совпадает с именем класса. Конструктор сам по себе не создает объект класса, он только настраивает его начальное состояние. В C#, в отличии от C++, если поля класса не инициализировать явно, они будут инициализированы значениями по умолчанию (числовые данные обычно нулями).

Конструктор по умолчанию – это конструктор, который вызывается без указания параметров. Если классу не задать ни одного конструктора, то конструктор по умолчанию будет сгенерирован автоматически. (не следует путать автоматическую генерацию конструктора системой с автоматической генерацией заготовки для конструктора по умолчанию мастером добавления нового класса). Конструктор по умолчанию может быть сгенерирован системой только в том случае, если у класса не определено явно других конструкторов.

Конструктор это метод класса, следовательно, для него возможно наличие перегруженных вариантов в том количестве, в котором это требуется логикой программы. К конструкторам применимы модификаторы доступа. Можно, например, запретить создание объектов класса (хотя для этого есть способ лучше – абстрактные классы).

КЛАССЫ

Объект (или класс) - модуль, который предназначен для выполнения в программе одной четко очерченной задачи.

Класс - это определяемый пользователем тип, который содержит данные(константы и переменные), а также операции(функции-члены или методы), выполняемые над ними. Объекты — это экземпляры класса. Хранение в одной структуре и данных, и методов называется инкапсуляцией. Инкапсуляция позволяет в максимальной степени изолировать объект от внешнего окружения. Она существенно повышает надежность разрабатываемых программ, т.к. локализованные в объекте функции обмениваются с программой сравнительно небольшими объемами данных, причем количество и тип этих данных обычно тщательно контролируются. В результате замена или модификация функций и данных, инкапсулированных в объект, как правило, не влечет за собой плохо прослеживаемых последствий для программы в целом (в целях повышения защищенности программ в ООП почти не используются глобальные переменные). Другим немаловажным следствием инкапсуляции является легкость обмена объектами, переноса их из одной программы в другую.

Чтобы определить новый тип или класс, следует вначале объявить его, а затем определить его методы и поля. Класс объявляется с помощью ключевого слова class.

Полный синтаксис такой:

[атрибуты] [модификаторы-прав-доступа] classидентификатор [базовый-класс]

{

// Объявление переменных экземпляров.

доступ тип переменная!;

доступ тип переменная2;

//. . .

доступ тип переменнаяN;

// Объявление методов

доступ тип_возврата метод1 (параметры) {

// тело метода

}

доступ тип_возврата метод2{параметры) {

// тело метода

}

доступ тип_возврата методN {параметры) {

// тело метода

}

}

Здесь элемент доступ означает спецификатор доступа (например, public), который определяет, как к этому члену можно получить доступ.

Определение класса в языке С# не надо заканчивать точкой с запятой. Тем не менее, если ее поставить, программа будет компилироваться.

В языке С# все происходит в рамках какого-нибудь класса.

Классы состоят из членов и могут включать следующие объекты:

  • константы,

  • события,

  • поля,

  • финализаторы,

  • индексаторы,

  • конструкторы экземпляров,

  • методы,

  • объявления вложенных типов,

  • операторы,

  • свойства,

  • статические конструкторы.

Модификаторы прав доступа к типам

Доступом к структурам и классам также можно управлять средствами модификаторов, контролирующих создание экземпляров; они напоминают модификаторы, управляющие доступом к членам.

Модификатор public разрешает доступ к соответствующему члену класса со стороны другого кода программы, включая методы, определенные внутри других классов.

Модификатор private разрешает доступ к соответствующему члену класса только для методов, определенных внутри того же класса. Таким образом, методы других классов не могут получить доступ к private-члену не их класса. При отсутствии модификатора доступа член класса является закрытым (private) по умолчанию. Следовательно, при создании закрытых членов класса модификатор private необязателен.

Экземпляр класса, объявленного с модификатором Public (public) способен создать любой объект приложения, объект класса с модификатором Friend (internal) — любой объект сборки, а объекты, которые не входят в данную сборку, этого сделать не могут. Модификаторы Private (private) и Protected (protected) применяются только с вложенными типами. Объект класса, объявленного с модификатором Private (private), создается только объектами того же типа или объектами его родительского типа (то есть типа, который содержит этот вложенный тип). Вложенные типы с модификатором Protected (protected) или ProtectedFriend (protectedinternal) доступны классам, производным от их родительского класса.

Классы, объявленные с модификатором Protectedfriend (protectedinternal), также видимы всем классам из данного пространства имен. Если модификатор доступа для класса или структуры не указан, по умолчанию считается, что задан модификатор Public (public).

Члены класса

Данные и функции внутри класса называют членами класса. Официальная терминология Microsoft делает различие между данными класса и функциями класса. Помимо этих членов, классы могут содержать вложенные типы (например, другие классы).

Данные класса

Данные класса — это те члены, которые содержат данные для класса: поля, константы и события.

Константы

Константа — это член класса, который, как и предлагает название, используется для представления постоянного значения. Такое постоянное значение можно либо объявить, либо вычислить во время компиляции. Константы могут зависеть от других констант той же программы, при этом запрещены только циклические зависимости (где A зависит от B, в то время как B определено и зависит от A).

Поля

Полем называется член, используемый для представления переменной, связанной с объектом или классом.

Формат объявления переменной экземпляра такой:

доступ тип имя_переменной;

Поля представляют собой любые переменные, связанные с классом. Если определить переменную на уровне класса, то на самом деле это будет поле класса. Если поля объявлены как public, они доступны за пределами класса. Например, можно определить класс PhoneCustomer с полями CustomerID, FirstName и LastName:

classPhoneCustomer

{

publicintCustomerID;

public string FirstName;

public string LastName;

}

После того как будет создан экземпляр объекта PhoneCustomer, к этим полям можно осуществлять доступ с помощью синтаксиса

объект.имя_поля

Пример:

PhoneCustomer Customer1= new PhoneCustomer ();

Customerl.CustomerID = 1000;

Customerl.FirstName = "Иван";

Customerl.LastName= "Петров";

Console.WriteLine (Customerl.FirstName + " " + Customerl.LastName);

События

События являются членами класса, которые позволяют объекту уведомлять вызывающего о том, что произошли некоторые программные изменения, например, изменилось поле или свойство класса либо имела место некоторая форма взаимодействия с пользователем. Клиент может содержать код, известный как обработчик ошибок, который реагирует на событие.

Функции класса

Функции класса являются теми членами, которые обеспечивают функциональность для работы с данными класса. Они включают в себя методы, свойства, конструкторы и деструкторы, операторы и индексаторы:

Методы

Методом называют член, реализующий действие, которое может выполняться объектом или классом.

Методы имеют

  • список формальных параметров (который может быть пустым),

  • возвращаемое значение (если только возвращаемым типом не является void).

Методы могут быть статическими и нестатическими:

  • статические методы доступны через класс (они предоставляют общую функциональность, не требующую создания экземпляра класса (подобно методу Console.WriteLine ()),

  • нестатические методы (методы экземпляра) доступны через экземпляры класса.

Свойства

Свойством называют член, обеспечивающий доступ к конкретной характеристике объекта или класса (например, такой как длина строки). Свойства в определенном смысле аналогичны полям, но, в отличие от полей, не указывают на области в памяти. Свойства имеют аксессоры (средства доступа), указывающие операторы, которые должны выполняться при доступе к свойству для чтения или записи.

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

Конструкторы являются функциями, которые вызываются при создании экземпляра объекта. Они обязаны иметь имя, совпадающее с именем класса, и не должны возвращать никаких значений. Конструкторы служат для установки значений полей при создании экземпляра объекта.

Статические конструкторы

Статический конструктор является членом, выполняющим действия, необходимые для инициализации класса. Статические конструкторы не могут использовать параметры,

модификаторы доступности.

Статические конструкторы не могут быть вызваны явно, а вызываются автоматически.

Деструкторы

Деструкторы аналогичны конструкторам, но вызываются при уничтожении объекта. Они имеют то же имя, что и класс, но с предшествующим значком тильды (~). Так как сборкой мусора занимается CLR, нельзя сказать точно, когда будет вызван деструктор. ВС# деструкторы используются менее часто, чем в C++.

Операции

Операция представляет собой член, определяющий значение выражения, которое можно применять к экземплярам данного класса. Можно определить следующие три вида операций:

  • бинарные операции,

  • операции преобразования,

  • унарные операции.

Классы могут также содержать определения операций, поэтому можно описать свои собственные операции или указать, как существующие операции будут работать с классом.

Индексаторы

Индексаторы позволяют индексировать объекты точно так же, как массивы и коллекции.

Финализаторы

Финализатор — это член, выполняющий действия, необходимые для завершения использования экземпляра класса. Соответствующие действия выполняются тогда, когда класс больше не нужен.

Финализаторы не могут использовать параметры, модификаторы доступности.

Финализаторы не могут быть вызваны явно. Финализатор любого экземпляра вызывается автоматически в процессе сборки мусора, выполняемого средствами .NET Framework.

Создание экземпляра класса

Определение class создает новый тип данных. Помните, что объявление class — это лишь описание типа; оно не создает реальных объектов. Чтобы реально создать объект класса, используется инструкция:

ИмяКласса Идентификатор= newИмяКласса(<СписокПараметров>);

или

ИмяКласса Идентификатор;

Идентификатор = newИмяКласса(<СписокПараметров>);

Оператор new динамически (т.е. во время выполнения программы) выделяет память для объекта и возвращает ссылку на него. Эта ссылка (сохраненная в конкретной переменной) служит адресом объекта в памяти, выделенной для него оператором new. Таким образом, в С# для всех объектов классов должна динамически выделяться память.

После выполнения этой инструкции Идентификатор станет экземпляром класса ИмяКласса, т.е. обретет "физическую" реальность. Идентификатор не определяет объект, а может лишь ссылаться на него. При каждом создании экземпляра класса создается объект, который содержит собственную копию каждой переменной экземпляра, определенной этим классом. Таким образом, содержимое переменных в одном объекте может отличаться от содержимого аналогичных переменных в другом. Между двумя объектами нет связи, за исключением того, что они являются объектами одного и того же типа.

Пример:

using System;

classXY

{ publicint x, y;}

classrez

{

staticvoid Main()

{

XY MyXY1=newXY();

XY MyXY2=newXY();

MyXY1.x=3; MyXY1.y=5;

MyXY2.x=4; MyXY2.y=7;

Console.WriteLine("1-йэкземпляр: x=" + MyXY1.x + " y=" + MyXY1.y);

Console.WriteLine("2-йэкземпляр: x=" + MyXY2.x + " y=" + MyXY2.y);

MyXY2= MyXY1;

Console.WriteLine("1-йэкземпляр: x=" + MyXY1.x + " y=" + MyXY1.y);//результат

Console.WriteLine("2-йэкземпляр: x=" + MyXY2.x + " y=" + MyXY2.y);//одинаков

}}

17

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]