- •2.Основные понятия объектно-ориентированного программирования — класс, объект, поле, метод, свойство.
- •4.Конструкторы и деструкторы. Функциональное назначение. Виды конструкторов.
- •5.Объекты и их жизненный цикл. Создание и уничтожение объектов.
- •6. Инкапсуляция. Определение. Функциональное назначение. Реализация. Примеры применения
- •7 Инкапсуляция. Свойства. Функциональное назначение. Реализация. Создание индексатора. Примеры применения.
- •8.Инкапсуляция. Скрытие членов класса. Функциональное назначение. Реализация. Примеры применения.
- •9.Наследование. Функциональное назначение. Реализация. Примеры применения.
- •10.Наследование. Конструктор по умолчанию. Назначение.
- •13. Методы. Определение. Функциональное назначение. Способы реализации. Примеры применения.
- •14.Полиморфизм. Функциональное назначение. Способы реализации. Примеры применения.
- •15.Перегрузка методов. Функциональное назначение. Способ реализации. Примеры применения.
- •16.Виртуальные методы. Функциональное назначение. Примеры применения.
- •17.Перегрузка операций. Функциональное назначение. Способ реализации. Примеры применения.
- •19.Исключительные ситуации. Понятие. Способы обработки исключительных ситуаций. Примеры применения.
- •20.Интерфейсы. Функциональное назначение. Иерархия интерфейсов. Множественное наследование: проблемы и способы их разрешения.
- •Interface имя{ тип_возврата имя_метода1 {список_параметров) ;
- •Void iProps.Prop3() { Console.WriteLine("Свойство 3 интерфейса 1"); }
- •Void iPropsOne.Prop3() { Console.WriteLine("Свойство 3 интерфейса 2"); }
- •21. Структуры (struct) и перечисления (enum). Отличия структур от классов.
- •1 RedDel имеет значение 2
- •Концепция типа данных. Встроенные типы данных и их реализация в языке с#
- •Концепция типа данных. Соглашения о совместимости и приведение типов
- •Концепция типа данных. Числовые типы данных.
- •Концепция типа данных. Символьные типы данных.
- •Концепция типа данных. Составные типы данных. Массивы и их реализация в с#. Структуры.
- •Концепция типа данных. Явное и неявное преобразование типов.
- •7. Концепция типа данных. Определение собственных типов данных.
- •Концепция типа данных. Значащие (размерные) (Value type) и ссылочные (Reference type) типы данных. Упаковка и распаковка (Boxing, Unboxing).
- •Концепция типа данных. Переменные и константы и их реализация в с#.
- •10. Принцип модульности программ. Глобальные и локальные имена. Область видимости имен. Выбор области видимости.
- •11. Принцип модульности программ. Метод, как отдельный модуль программы. Интерфейсная и скрытая часть метода. Формальные и фактические параметры метода. Примеры применения.
- •12. Унарные и мультипликативные операции. Примеры применений.
- •13. Аддитивные и сдвиговые операции. Примеры применений.
- •14. Операции отношения и действий над типами данных. Примеры применений.
- •If (a is a) Console.WriteLine("Объект а имеет тип a.");
- •If(b is в) Console.WriteLine("Объект b имеет тип в."); if(a is object) Console.WriteLine("а — это объект."); }}
- •15. Логические операции. Примеры применений.
- •16. Организация циклов в с#. Примеры применений.
- •17. Операторы перехода и оператор присваивания.
- •18. Операторы условного перехода. Примеры применений.
9.Наследование. Функциональное назначение. Реализация. Примеры применения.
Насле́дование — механизм объектно-ориентированного программирования позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом. Другими словами, класс-наследник реализует спецификацию уже существующего класса (базовый класс). Это позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса.
Наследование (Генерализация) — объекты дочернего класса наследуют все свойства родительского класса.
Пример:
publicclass A { }
publicinterface I1 { }
publicinterface I2 { }
publicclass B : A, I1, I2 { }
Агрегация — объекты одного класса входят в объекты другого.
Пример:
class A
{ public class B : A { } }
10.Наследование. Конструктор по умолчанию. Назначение.
Насле́дование— механизм объектно-ориентированного программирования
позволяющий описать новый класс на основе уже существующего (родительского), при этом свойства и функциональность родительского класса заимствуются новым классом.
Другими словами, класс-наследник реализует спецификацию уже существующего класса (базовый класс). Это позволяет обращаться с объектами класса-наследника точно так же, как с объектами базового класса.
При наследовании каждый класс должен позаботиться о создании собственных конструкторов. Он не может в этом вопросе полагаться на родителя, поскольку, как правило, добавляет собственные поля, о которых родитель ничего не может знать. Конечно, если не задать конструкторов класса, то будет добавлен конструктор по умолчанию, инициализирующий все поля значениями по умолчанию. Но это редкая ситуация. Чаще всего, класс создает собственные конструкторы и, как правило, не один, задавая разные варианты инициализации полей.
При создании конструкторов классов потомков есть одна важная особенность. Всякий конструктор создает объект класса - структуру, содержащую поля класса. Но потомок, прежде чем создать собственный объект, вызывает конструктор родителя, создавая родительский объект, который затем будет дополнен полями потомка. Ввиду транзитивности этого процесса, конструктор родителя вызывает конструктор своего родителя, и этот процесс продолжается, пока первым делом не будет создан объект прародителя.
Вызов конструктора родителя происходит не в теле конструктора, а в заголовке, пока еще не создан объект класса. Для вызова конструктора используется ключевое слово base, именующее родительский класс. Пример конструкторов класса Derived:
public Derived() {}
public Derived(string name, int cred, int deb):base (name, cred)
{ debet = deb; }
Для конструктора без аргументов вызов аналогичного конструктора родителя подразумевается по умолчанию. Для конструкторов с аргументами вызов конструктора с аргументами родительского класса должен быть явным. Этот вызов синтаксически следует сразу за списком аргументов конструктора, будучи отделен от этого списка символом двоеточия. Конструктору потомка передаются все аргументы, необходимые для инициализации полей, часть из которых передаются конструктору родителя для инициализации родительских полей.
Итак, вызов конструктора - потомка приводит к цепочке вызовов конструкторов - предков, заканчивающейся вызовом конструктора прародителя. Затем в обратном порядке создаются объекты, начиная с объекта прародителя, и выполняются тела соответствующих конструкторов, инициализирующие поля и выполняющие другую работу этих конструкторов. Последним создается объект потомка и выполняется тело конструктора потомка.
При отсутствии ключевого слова base автоматически вызывается конструктор базового класса, действующий по умолчанию. Конструктор по-умолчанию потомка автоматически вызывает конструктор по-умолчанию предка, т.е. слово base не нужно.
Наследование (Генерализация) — объекты дочернего класса наследуют все свойства родительского класса.
Пример:
publicclass A { }
publicinterface I1 { }
publicinterface I2 { }
publicclass B : A, I1, I2 { }
Агрегация — объекты одного класса входят в объекты другого.
Пример:
class A
{ public class B : A { } }
11. Наследование. Проблема тождественности имен членов классов. Реализация. Примеры применения.
Производный класс может определить член, имя которого совпадает с именем члена базового класса. В этом случае член базового класса становится скрытым в производном классе. Поскольку с точки зрения формального синтаксиса языка С# эта ситуация не является ошибочной, компилятор выразит свое "недоумение" всего лишь предупреждающим сообщением. Это предупреждение должно послужить напоминанием о факте сокрытия имени. Если вы действительно собирались скрыть член базового класса, то для предотвращения этого предупреждения перед членом произвольного класса необходимо поставить ключевое слово new. Необходимо понимать, что эта функция слова new совершенно отличается от его использования при создании экземпляра объекта. Рассмотрим пример сокрытия имени.
// Пример сокрытия имени в связи с наследованием.
using System;
class A { public int i = 0; }
// Создаем производный класс,
class В : А {
new int i; // Этот член i скрывает член i класса А.
public В(int b) {
i = b; // Член i в классе В.
public void show() {
Console.WriteLine(
"Член i в производном классе: " + i);
class NameHiding {
public s t a t i c void Main() {
В ob = new В(2);
ob.show();
Во-первых, обратите внимание на использование ключевого слова new при объявлении члена i в классе в. По сути, он сообщает компилятору о том, что вы знаете, что создается новая переменная с именем i, которая скрывает переменную i в базовом классе А. Если убрать слово new, компилятор сгенерирует предупреждающее сообщение.Результаты выполнения этой программы выглядят так: /
I Член i в производном классе: 2
Поскольку в классе в определяется собственная переменная экземпляра с именем
i , она скрывает переменную i, определенную в классе А. Следовательно, при вызове
метода show() для объекта типа в, отображается значение переменной для б, а не для а
Использование ключевого слова base для доступа к скрытому имени. Существует вторая форма использования ключевого слова base, которая действует подобно ссылке this, за исключением того, что ссылка base всегда указывает на базовый класс производного класса, в котором она используется. В этом случае формат ее записи такой: base.член Здесь в качестве элемента член можно указывать либо метод, либо переменную экземпляра. Эта форма ссылки base наиболее применима в тех случаях, когда имя члена в производном классе скрывает член с таким же именем в базовом классе. Рассмотрим следующую версию иерархии классов из предыдущего примера:
// Использование ссылки base для доступа к скрытому имени.
using System;
class A { public int i = 0; }
// Создаем производный класс,
class В : А { new int i; // Эта переменная i скрывает i класса А.
publicВ(int a, int b) { ! base.i = а; // Так можно обратиться к i класса А.
i = b; // Переменная i в классе В. }
public void show() {
// Эта инструкция отображает переменную i в классе А.
Console.WriteLine("i в базовом классе: " + base.i);
// Эта инструкция отображает переменную i в классе В.
Console.WriteLine("i в производном классе: " + i );
class UncoverName { public static void Main() {
В ob = new В(1f 2 );
ob.show();
Результаты выполнения этой программы выглядят так: i в базовом классе: 1
i в производном классе: 2 Несмотря на то что переменная экземпляра i в классе В скрывает переменную, base позволяет получить доступ к базовому классу.
