- •Парадигмы программирования предпосылки появления, обзор существующих парадигм программирования.
- •3.2. Процедурная парадигма
- •3.2.1. История возникновения парадигмы
- •3.2.2. Языки, поддерживающие парадигму
- •3.2.3. Представление программ и реализация вычислений
- •Основные принципы объектно-ориентированной парадигмы.
- •Наследование и агрегация как реализации принципа иерархии в ооАиП.
- •Анализ и проектирование программного обеспечения: .Цели, классификация.
- •Структурный анализ программных систем: основные принципы, существующие методологии.
- •Диаграммы переходов состояний (std): назначение, нотация, примеры реализации.
- •Объектно-ориентированный анализ: базовые принципы, методология.
- •Язык uml: назначение, структура, нотация.
- •Сущности uml: типы, нотация, примеры описания.
- •Отношения uml: типы, нотация, примеры применения.
- •Диаграммы прецедентов uml: назначение, .Используемые элементы, примеры построения.
- •Диаграммы классов uml: назначение, используемые элементы, примеры построения.
- •Диаграммы взаимодействия uml: назначение, используемые элементы, примеры построения.
- •.Метрики качества структурного и объектно-ориентированного анализа и проектирования.
- •Понятие объекта и класса в объектно-ориентированном программировании. Члены-данные и члены функции.
- •2. Объект - как базовое понятие в объектно-ориентированном программировании
- •17.Конструкотр и деструктор.
- •18. Реализация принципа инкапсуляции ограничением области видимости компонент.
- •19. Аксессоры доступа к закрытым компонентам класса.
- •20. Статические компоненты класса: назначение, особенности и примеры использования.
- •Перегрузка стандартных операций: назначение, синтаксические особенности, примеры реализации.
- •Исключительные ситуации и способы их обработки. Блоки обработки и блоки завершения. Структурная обработка исключительных ситуаций.
- •Реализация принципа наследования в объектно-ориентированных языках программирования. Виды наследования.
- •Объявление наследования. Порядок определения новых и переопределения унаследованных компонент класса. Модификация области видимости компонент класса при наследовании.
- •Множественное наследование: объявление, примеры реализации, недостатки. Виртуальное наследование.
- •Виртуальные функции и полиморфизм – назначение, примеры практического использования.
- •Абстрактные классы: определение, назначение, примеры использования.
- •Интерфейс: назначение, синтаксис определения, примеры использования.
- •Основные принципы обобщенного программирования, его достоинства и недостатки.
- •Обобщение функций и методов: синтаксис определения, инстанцирование, особенности использования.
- •Обобщенные классы: синтаксис определения, примеры объявления и конкретизации.
- •Коллекции с#: реализация интерфейсов для сортировки элементов.
- •Делегаты c# как основной тип функторов.
- •Шаблоны проектирования: определение, классификация, назначение, достоинства и недостатки.
- •Шаблон Одиночка (Singleton): описание и пример программной реализации.
- •Шаблон Адаптер: назначение, структура, пример программной реализации.
- •Шаблон Наблюдатель (Observer): структура, пример реализации на языке c# с использованием событий (Events)
- •Архитектурный шаблон mvc: назначение, возможные структурные решения, примеры практической реализации
19. Аксессоры доступа к закрытым компонентам класса.
Свойство в Си-шарп – это член класса, который предоставляет удобный механизм доступа к полю класса (чтение поля и запись). Свойство представляет собой что-то среднее между полем и методом класса. При использовании свойства, мы обращаемся к нему, как к полю класса, но на самом деле компилятор преобразовывает это обращение к вызову соответствующего неявного метода. Такой метод называется аксессор (accessor). Существует два таких метода: get (для получения данных) и set(для записи). Объявление простого свойства имеет следующую структуру:
[модификатор доступа] [тип] [имя_свойства] { get { // тело аксессора для чтения из поля } set { // тело аксессора для записи в поле } }
Приведу пример использования свойств. Имеется класс Студент, и в нем есть закрытое поле курс, которое не может быть ниже единицы и больше пяти. Для управления доступом к этому полю будет использовано свойство Year:
class Student { private int year; //объявление закрытого поля public int Year //объявление свойства { get // аксессор чтения поля { return year; } set // аксессор записи в поле { if (value < 1) year = 1; else if (value > 5) year = 5; else year = value; } } } class Program { static void Main(string[] args) { Student st1 = new Student(); st1.Year = 0; // записываем в поле, используя аксессор set Console.WriteLine(st1.Year); // читаем поле, используя аксессор get, выведет 1 Console.ReadKey(); } }
Проще говоря, в свойстве реализуются два метода. В теле аксессора getможет быть более сложная логика доступа, но в итоге должно возвращаться значение поля, либо другое значение с помощью оператора return. В аксессоре set же присутствует неявный параметр value, который содержит значение, присваиваемое свойству (в примере выше, при записи, значениеvalue равно «0»).
20. Статические компоненты класса: назначение, особенности и примеры использования.
Иногда требуется определить такой член класса, который будет существовать независимо от всех остальных объектов этого класса. Такой компонент используется в контексте всего класса, а не конкретного объекта. При этом доступ к члену класса можно организовать как посредством объекта этого класса, так и не имея в распоряжении ни одного экземпляра класса. Этого можно добиться, объявив данный компонент статическим. Для этого в теле класса необходимо определить компонент следующим образом:
static тип имя_статического_компонентного_данного;
Ключевое слово static определяет компонент статическим. Основное свойство статического компонентного данного заключается в том, что память под него выделяется единственный раз в программе, причем еще до определения объектов данного класса. Для выделения памяти под статический элемент данных класса необходимо вне класса на внешнем уровне программы поместить инициализатор статического компонента вида
тип имя_класса :: имя_статического_компонентного_данного=выражение;
Встретив такой инициализатор, компилятор выделяет память под объект указанного типа данных и заносит в него значение инициализирующего выражения.
При создании объектов класса память под статический элемент данных не выделяется, все объекты работают с единственным статическим компонентом. Обращаться к статическому компоненту класса можно как к обычному компоненту через имя уже существующего объекта, словно он является частью этого объекта. При этом необходимо учитывать, что, обращаясь к компонентному данному через имя одного объекта, мы изменяем его значение и для всех остальных объектов того же класса.
Так как память под статический элемент данных выделяется еще до определения объектов, существует еще один способ обращения к нему:
имя_класса :: имя_статического_компонентного_данного
Такой способ используется для изменения значения статического члена данных в тот момент, когда недоступен ни один из объектов класса.
Необходимо также отметить, что на статические компоненты класса действуют ограничения по области видимости, задаваемые ключевыми словами public, protected и private в теле класса.
В приведенном ниже листинге 12 статическое компонентное данное count будет подсчитывать количество созданных экземпляров класса. В конструкторе при создании каждого нового объекта значение count будет увеличиваться на 1, а в деструкторе – уменьшаться на 1 при уничтожении объекта.
//Листинг 12. Статические компоненты класса
class MyClass
{ public:
//определяем статический компонент
static int count;
MyClass()
{
count++;
…}
~MyClass()
{ count--;
}
…
};
//инициализация статического компонента
int MyClass::count=0;
main()
{
MyClass c1();
MyClass *c2=new MyClass();
cout<<MyClass::count; //вывод числа 2
//допустимо и cout<<c1.count;
}
Статическими можно объявить и методы класса. В связи с тем, что методы класса, как уже упоминалось, и так существуют в памяти в единственном экземпляре, не множась для каждого созданного объекта, смысл объявления статического метода в классе может быть лишь один – он должен работать со статическими компонентными данными. Статический метод может быть вызван вне контекста объекта:
имя_класса :: имя_статического_метода ( список_фактических_парамет-
ров )
