Главная Обратная связь

Дисциплины:






Понятие класса в ООП. Синтаксис объявления класса. Члены класса. Полный



Член класса — данные об объекте или действиях с ним, описанные в классе.

Члены класса: поля (переменные), методы, свойства, события (?).

Синтаксис:

<атрибуты> <модификаторы> class <имя_класса>: <родители класса>

{

<тело_класса>

}

Атрибут — некоторая дополнительная информация, которая может быть приписана к конструкциям языка (тип, поле, метод, свойство).

Все атрибуты являются классами (потомками класса System.Attribute). Возможно создание своих атрибутов и применение их к коду.

Модификатор — средство ограничения доступа к членам класса.

Синтаксис некоторых членов класса (“внутренностей” класса):

public class A

{

public A()

{

// Определение конструктора без параметров

}

// Перегруз коснтруктора

public A(int a, int b)

{

// Определение конструктора с параметрами

}

public int k;

// Член, доступный любому классу программы.

internal int l;

// Член, доступный любому классу в том же модуле программы.

protected internal int m;

// Член, доступный любому классу в том же модуле программы либо только текущему классу и всем его подклассам в другом модуле.

protected int n;

// Член, доступный только текущему классу и всем его подклассам.

private int p;

// Член, доступный только из текущего класса (по умолчанию).

}

Виды классов:

· Базовый класс (суперкласс / родитель) — класс, на основе которого создаются другие классы.

· Производный класс (дочерний / потомок) — класс, наследуюший поля и методы другого класса.

· Абстрактный класс — класс, не предполагающий создания экземпляров (объектов класса).

· Интерфейс — семантическая и синтаксическая конструкция в коде программы, используемая для специфицирования услуг, предоставляемых классом или компонентом.

4. Объекты в ООП. Принадлежность объекта типу (связь между типом и объектом). Жизненный цикл объектов: создание и разрушение объектов. Garbage Collector и разрушение объектов. Полный.

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

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

Конструктор — метод, вызываемый при создании объекта.

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

Деструктор — метод, служащий для деинициализации (удалении) объекта (например, освобождение памяти).



Деструктор отличается от конструктора тем, что имеет символ ~ перед именем деструктора, которое также совпадает с именем класса.

Сборщик мусора (Garbage Collector).

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

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

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

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

После освобождения памяти прерванная операция выделения памяти возобновляется и программа продолжает исполняться дальше. Если же оказывается, что освободить память невозможно, среда исполнения останавливает программу с сообщением об ошибке «Недостаточно памяти».

5. Конструкторы: понятие, назначение, примеры применения. Параметризованные конструкторы. Конструкторы «по-умолчанию». Скрытые (private) конструкторы. Полный.

Конструктор — метод, вызываемый при создании объекта.

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

Конструктор не имеет явным образом определенного типа возвращаемых данных.

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

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

Конструктор без параметров обычно переопределяется в классе-потомке.

Для создания конструктора с параметрами нужно задать имена и типы данных аргументов.

Если конструктор не определен вообще, он автоматически наследует конструктор от класса “Object” (в C#).

Деструктор — метод, служащий для деинициализации (удалении) объекта (например, освобождение памяти).

Деструктор отличается от конструктора тем, что имеет символ ~ перед именем деструктора, которое также совпадает с именем класса.

Закрытый конструктор. Особый конструктор экземпляров.

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

6. Инкапсуляция: понятие, назначение, примеры применения. Ограничение области видимости членов класса (private, public, protected, internal). Полный.

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

  • Пользователь может взаимодействовать с объектом только через этот интерфейс. Внутренние поля объекта напрямую недоступны, и пользователь может работать с объектом только как с единым целым. Реализуется с помощью ключевого слова: public.
  • Пользователь не может использовать закрытые данные и методы. Реализуется с помощью ключевых слов (модификаторов): private, protected, internal.

Инкапсуляция — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с абстракцией, полиморфизмом и наследованием).

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

  • предельная локализация изменений при необходимости таких изменений,
  • прогнозируемость изменений (какие изменения в коде надо сделать для заданного изменения функциональности) и прогнозируемость последствий изменений.

Целью инкапсуляции является обеспечение согласованности внутреннего состояния объекта. В C# для инкапсуляции используются публичные свойства и методы объекта. Переменные, за редким исключением, не должны быть публично доступными.

Модификатор — средство ограничения доступа к членам класса.

В зависимости от того, какой уровень доступа нужно предоставляеть члену класса, выделяют:

· public — обеспечение доступа из любого места программы.

· internal — ограничение видимости внутри сборки (сборка — код программы после компиляции). // в C#

· protected — обеспечение доступа наследникам, но запрет доступа пользователю.

· private — обеспечение доступа только внутри класса.

7. Инкапсуляция. Реализация механизма инкапсуляции через свойства. Функции-аксессоры (set, get). Отсутствие или ограничение области видимости одного из аксессоров. Неполный (?).

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

Индексатор — средство, позволяющее индексировать экземпляры также, как массивы.

Ключевое слово this используется для определения индексаторов. get — возвращает значение, set — присваивает значение.

Синтаксис индексатора:

<модификатор> <тип> this [список_параметров]

{

get

{

// код_доступа

}

set

{

// код_доступа

}

}

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

Код доступа представляет собой блоки операторов, которые выполняются при получении (get) или установки (set) элемента массива.

Пример:

const int Child_Max = 20; // максимальное число детей (константа)

Person[] children = new Person[Child_Max];

int count_children = 0; // число детей

public Person this[int i] // индексатор с именем this

{

get {if (I >= 0 && I < count_children) return(children);

else return(children[0]);

}

set

{

if (i == count_children && i < Child_Max)

{ children = value; count_children++; }

}

}

Имя у индексатора — this, в квадратных скобках в заголовке перечисляются индексы. В методах get и set, обеспечивающих доступ к массиву children, по которому ведется индексирование, анализируется корректность задания индекса. Закрытое поле count_children, хранящее текущее число детей, доступно только для чтения благодаря добавлению соответствующего метода-свойства. Запись в это поле происходит в методе set индексатора, когда к массиву children добавляется новый элемент.

8. Наследование: понятие, назначение, примеры применения. Поведение различных членов класса при наследовании. Совпадения сигнатур методов при наследовании. Полный.

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

Класс-потомок получает все поля и методы класса-родителя, но может дополнять их собственными, либо переопределять уже имеющиеся.

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

Множественное наследование создаёт целый ряд проблем, как логических, так и чисто реализационных, поэтому в полном объёме его поддержка не распространена. Вместо этого в 1990-е годы появилось и стало активно вводиться в объектно-ориентированные языки понятие интерфейса.

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

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

Если у класса нет родителей, он по умолчанию наследуется классом “Object”. Если у класса без родителей не определен конструктор, он автоматически наследует конструктор класса “Object”.

“Object” — исходный базовый класс всех классов.

Поведение членов класса при наследовании.

Модификатор — средство ограничения доступа к членам класса.

В зависимости от того, какой уровень доступа нужно предоставляеть члену класса, выделяют:

· public — обеспечение доступа из любого места программы.

· internal — ограничение видимости внутри сборки (сборка — код программы после компиляции).

· protected — обеспечение доступа наследникам, но запрет доступа пользователю.

· private — обеспечение доступа только внутри класса.

Совпадения сигнатур методов при наследовании.

Если при наследовании существуют методы с одинаковыми сигнатурами (именами) и в суперклассе и в потомке:

Как член базового класса, метод (например) вызывается с помощью ключевого слова this. Член класса-потомка вызывается лишь с помощью своего имени.

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

9. Агрегация: понятие, назначение, примеры применения. Отличия от наследования. Жизненный цикл агрегируемых объектов. Полный (?).

Агрегация — технология, позволяющая использовать объект в качестве поля другого объекта.

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

При этом, если удалить агрегатор, удалятся и все включенные в него объекты.

Различия между агрегацией и наследованием:

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

· При наследовании создается отдельный класс, при агрегации нет.

· При агрегации осуществляется больший контроль за влиянием предок влияет на потомка (и наоборот), чем при наследовании.

Методы класса. Сигнатура метода. Абстрактные (abstract), виртуальные (virtual) и перезаписанные (override) методы. Статические (static) методы классов и особенности их применения. Полный.

Метод — процедура или функция, принадлежащая какому-либо классу (объекту).

Метод — процедура или функция (подпрограмма), управляющая данными, которые определены в классе. Они определяют действия, которые можно выполнять над объектом такого типа, и которые сам объект может выполнять. Может обеспечивать доступ к данным (как и свойство).

Сигнатура метода— набор информации, необходимой для описания его вызова: имя, параметры и их типы.

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

Различают простые и статические методы (методы класса):

· простые методы имеют доступ к данным объекта (конкретного экземпляра класса),

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

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

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

Модификатор override требуется для расширения или изменения абстрактной или виртуальной реализации унаследованного метода, свойства, индексатора или события.

11. Перегрузка операций: понятие, назначение, примеры применения. Перегрузка арифметических и логических операций. Особенности перегрузки операции равенства (==). Неполный.

Операция — действие над объектом (сложение, вычитание, …). Оператор — символ, обозначающие операцию. Операнд — значение-участник операции.

Перегрузка операции — существование нескольких реализаций одной и той же операции. Большинство операций языка C# перегружены — одна и та же операция может применяться к операндам различных типов.

Операции, как правило, выполняются над операндами одного типа. Если же операнды разных типов, то либо предварительно происходит неявное преобразование типа операнда, либо требуется явное преобразование.

При перегрузке оператора ни одно из его исходных значений не теряется. Перегрузку оператора можно расценивать как введение новой операции для класса.

Перегрузка операторов тесно связана с перегрузкой методов. Для перегрузки операторов используется ключевое слово operator, позволяющее создать операторный метод, который определяет действие оператора, связанное с его классом.

Существует две формы методов operator’а: одна используется для унарных (одноместных) операторов, а другая — для бинарных (двуместных).

Общий формат перегрузки для унарного оператора:

public static <тип_возврата> operator <оператор> (<тип_параметра> <операнд>)

{

// операции

}

Общий формат перегрузки для бинарного оператора:

public static <тип_возврата> operator <оператор> (<тип_параметра1> <операнд1>, <тип_параметра2> <операнд2>)

{

// операции

}

При перегрузке операций в C# существует ряд ограничений:

· Нельзя придумать свои знаки операций.

· Нельзя изменить приоритет операции. Например, если для чисел приоритет операции умножения выше, чем сложения, то и в классе пользователя при перегрузке этих операций сохраняется то же старшинство действий.

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

· Параметры можно передавать в метод для реализации операции только по значению (ref и out запрещены).

· Нельзя перегружать операторы присваивания (=, +=).

· Операции сравнения перегружаются парами (противоположными по смыслу): <= и >=, < и >, == и !=.

· При перегрузке операций сравнения необходимо перегрузить два метода, наследуемые из класса Object: Equals() и GetHashCode().

12. Полиморфизм: понятие, назначение, примеры применения. Суть принципа «один интерфейс – множество методов». Полный (?).

Полиморфизм («поли» — много, «морф» — форма; многоформность) — возможность использования одинаковых (тождественных) имен для различных членов класса.

В ООП проявляется в 3 видах:

· Возможность использования тождественных имен в различных классах.

· Перегрузка. Возможность использования тождественных имен в рамках одного класса.

· Аппарат виртуальных методов. Переопределение виртуальных методов в производных суперкласса.

Смысл полиморфизма: «Один интерфейс — множество реализаций». Например, реализация суперкласса может быть изменена в его наследниках.

13. Исключительные ситуации: понятие, назначение, примеры применения. Иерархия исключений. Создание (throw) и перехват (try-catch-finally) объектов-исключений. Способы реагирования на исключительные ситуации. Исключения, которые нельзя перехватить. Неполный.

Исключительная ситуация — ситуация, при которой нарушается ожидаемая логика работы программы.

Для обработки исключительной ситуации ОС генерирует событие и создает объект, содержащий ее описание.

Назначение — извещение пользователя об ошибке, и, по-возможности, устранение последствий ошибки.

В С# исключения представляются классами. Все исключения являются подклассами класса Exception (который является частью пространства имен System).

Управление С#-механизмом обработки исключений основывается на четырех ключевых словах: try, catch, throw и finally.

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

Это выброшенное исключение может быть перехвачено программным путем с помощью catch-блока и обработано соответствующим образом.

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

Любой код, который должен быть обязательно выполнен при выходе из try-блока, помещается в блок finally.

Ядром обработки исключений являются блоки try и catch. Эти ключевые слова работают "в одной связке"; нельзя использовать одно отдельно от другого.

Вот каков формат записи try/catch-блоков обработки исключений:

try

{

// Блок кода, подлежащий проверке на наличие ошибок.

}

catch (ExcepType1 ex)

{

// Обработчик для исключения типа ExcepTypel.

}

catch (ExcepType2 ex)

{

// Обработчик для исключения типа ЕхсерТуре2.

}

ЕхсерТуре — тип сгенерированного исключения. После "выброса" исключение перехватывается соответствующей инструкцией catch, которая его обрабатывает. Как видно из формата записи try/catch-блоков, с try-блоком может быть связана не одна, а несколько catch-инструкций. Какая именно из них будет выполнена, зависит от типа исключения.

14. Интерфейсы: понятие, назначение, примеры применения. Реализация интерфейсов. Приведение к интерфейсу. Коллизия имен при реализации двух и более интерфейсов. Назначение интерфейсов IComparable, IClonable, ISerializeable. Неполный.

Интерфейс — абстрактный класс, все методы которого определены, но не реализованы. Синтаксис аналогичен синтаксису класса.

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

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

Отличия интерфейса от абстрактного класса:

· элементы интерфейса по умолчанию имеют спецификатор доступа public и не могут иметь спецификаторов, заданных явным образом;

· интерфейс не может содержать полей и обычных методов — все элементы интерфейса должны быть абстрактными;

· класс, в списке предков которого задается интерфейс, должен определять все его элементы, в то время как потомок абстрактного класса может не переопределять часть абстрактных методов предка (в этом случае производный класс также будет абстрактным);

· класс может иметь в списке предков несколько интерфейсов, при этом он должен определять все их методы.

15. Функциональный тип – делегаты: понятие, назначение, примеры применения. Функция, как экземпляр делегата. Делегат, как свойство класса. Неполный.

Делегат — шаблон, определяющий синтаксис оператора, который описывает метод.

Делегаты являются ссылками на методы, инкапсулирующими настоящие указатели и предоставляющими удобные сервисы для работы с ними. Ссылки представляют собой объекты соответствующего типа. Все делегаты являются объектами типа System.Delegate (или System.MulticastDelegate, который является производным от первого).

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

 

1. Программный проект: консольный, оконный. Файлы, составляющие проект. Исполняемые файлы (*.ЕХЕ). Понятие «сборки» в .NET. Ничего.

Сборка — код программы после компиляции. // в C#

2. Система типов языка C#. Размерные (value-type) и ссылочные (reference-type) типы. Семантика присваивания. Преобразования между ссылочными и размерными типами. «Упаковка-распаковка» типов (boxing, unboxing).





sdamzavas.net - 2020 год. Все права принадлежат их авторам! В случае нарушение авторского права, обращайтесь по форме обратной связи...