- •1. Net Framework – единый каркас среды разработки. Исполнительная среда clr. Понятие и функции среды разработки. Управляемый и неуправляемый код. Сборщик мусора.
- •2. Управляемый и неуправляемый код. .Net Framework: особенности разработки приложений с использованием библиотеки .Net Framework. Необходимость установки нескольких версий библиотеки.
- •3. Единство каркаса Framework .Net. Встроенные примитивные и структурные типы.
- •4. Классификация типов данных языка с#. Система типов .Net Framework и языка с#: особенности применения. Преобразования типов. Семантика присваивания. Преобразование к типу Object.
- •6. Массивы языка с#. Статические и динамические массивы. Массивы объектов. Семантика присваивания.
- •7. Строки c#. Классы String и StringBuilder. Назначение, основные возможности, отличие.
- •8. Строки c#. Класс String. Конструкторы класса. Методы работы со строками.
- •9. Строки c#. Класс String. Методы Join и Split.
- •10. Строки c#. Класс StringBuilder. Конструкторы класса. Методы работы со строками. Основные методы. Емкость буфера.
- •11. Структуры c#. Синтаксис. Возможные ситуации использования классов и структур. Перечисления в c#. Назначение. Синтаксис.
- •12. Классы в c#. Роль классов в ооп. Синтаксис классов в c#: обычных, абстрактных, универсальных. Поля и методы классов. Области видимости.
- •13. Процедуры и функции на примере языка с#. Определение. Синтаксис. Использование ключевых слов для передачи параметров.
- •14. Классы в c#. Методы-свойства. Назначение. Синтаксис. Пример описания.
- •15. Классы в c#. Статические поля и методы. Конструкторы и деструкторы. Статический конструктор класса: пример объявления и использования.
- •16. Классы в c#. Отношения между классами. Клиенты и наследники. Отношение вложенности. Расширение клиента класса.
- •17. Классы в c#. Отношения между классами. Отношения между клиентами и поставщиками.
- •18. Классы в c#. Наследование. Конструкторы родительских классов и классов потомков. Возможности изменения классом потомком методов родительского класса.
- •19. Классы в c#. Статический контроль типов и динамическое связывание. Реализация полиморфизма.
- •20. Классы в c#. Абстрактные классы. Классы без потомков.
- •21. Интерфейсы в c#. Реализация интерфейса. Преобразование к классу интерфейса. Множественное наследование. Проблемы множественного наследования.
- •22. Функциональный тип в c#. Делегаты. Делегаты как свойства классов.
19. Классы в c#. Статический контроль типов и динамическое связывание. Реализация полиморфизма.
Контролем типов называется проверка каждого вызова, удостоверяющая, что:
• в классе A1 объекта x1 действительно имеется метод M;
• список фактических аргументов в точке вызова соответствует по числу и типам списку формальных аргументов метода M, заданного в классе A1.
Язык C#, как и большинство других языков программирования, позволяет выполнить эту проверку еще на этапе компиляции и в случае нарушений выдать сообщение об ошибке периода компиляции. Контроль типов, выполняемый на этапе компиляции, называется статическим контролем типов.
Статическим связыванием называется связывание цели вызова и вызываемого метода на этапе компиляции, когда с сущностью связывается метод класса, заданного при объявлении сущности.
Динамическим связыванием называется связывание цели вызова и вызываемого метода на этапе выполнения, когда с сущностью связывается метод класса объекта, связанного с сущностью в момент выполнения.
Под полиморфизмом в ООП понимают способность одного и того же программного текста x.M выполняться по-разному, в зависимости от того, с каким объектом связана сущность x. Полиморфизм гарантирует, что вызываемый метод M будет принадлежать классу объекта, связанному с сущностью x.
20. Классы в c#. Абстрактные классы. Классы без потомков.
С наследованием тесно связан еще один важный механизм проектирования семейства классов - механизм абстрактных классов. Начну с определений.
Класс называется абстрактным, если он имеет хотя бы один абстрактный метод.
Метод называется абстрактным, если при определении метода задана его сигнатура, но не задана реализация метода.
Объявление абстрактных методов и абстрактных классов должно сопровождаться модификатором abstract. Поскольку абстрактные классы не являются полностью определенными классами, то нельзя создавать объекты абстрактных классов.
Абстрактные классы могут иметь потомков, частично или полностью реализующих абстрактные методы родительского класса. Абстрактный метод чаще всего рассматривается как виртуальный метод, переопределяемый потомком, поэтому к ним применяется стратегия динамического связывания.
Иногда полезным видом классов являются классы, для которых запрещается строить классы-потомки путем наследования. При создании такого класса нет необходимости в выполнении над классом каких-либо болезненных операций. Вполне достаточно приписать классу модификатор sealed - он и запрещает построение потомков.
21. Интерфейсы в c#. Реализация интерфейса. Преобразование к классу интерфейса. Множественное наследование. Проблемы множественного наследования.
Интерфейс представляет собой полностью абстрактный класс, все методы которого абстрактны.
Давайте опишем некоторый интерфейс, задающий дополнительные свойства объектов класса:
public interface IProps
{
void Prop1(string s);
void Prop2 (string name, int val);
}
У этого интерфейса два метода, которые и должны будут реализовать все классы - наследники интерфейса. Заметьте, у методов нет модификаторов доступа.
Класс, наследующий интерфейс и реализующий его методы, может реализовать их явно, объявляя соответствующие методы класса открытыми. Вот пример:
public class Clain:IProps
{
public Clain() {}
public void Prop1(string s)
{
Console.WriteLine(s);
}
public void Prop2(string name, int val)
{
Console.WriteLine("name = {0}, val ={1}", name, val);
}
}
Преобразование задается явно. Имея объект, можно вызывать методы интерфейса - даже если они закрыты в классе, для интерфейсных объектов они являются открытыми. Приведу соответствующий пример, в котором идет работа как с объектами классов Clain, ClainP, так и с объектами интерфейсного класса IProps:
public void TestClainIProps()
{
Console.WriteLine("Объект класса Clain вызывает
открытые методы!");
Clain clain = new Clain();
clain.Prop1(" свойство 1 объекта");
clain.Prop2("Владимир", 44);
Console.WriteLine("Объект класса IProps вызывает
открытые методы!");
IProps ip = (IProps)clain;
ip.Prop1("интерфейс: свойство");
ip.Prop2 ("интерфейс: свойство",77);
Console.WriteLine("Объект класса ClainP вызывает
открытые методы!");
ClainP clainp = new ClainP();
clainp.MyProp1(" свойство 1 объекта");
clainp.MyProp2("Владимир", 44);
Console.WriteLine("Объект класса IProps вызывает
закрытые методы!");
IProps ipp = (IProps)clainp;
ipp.Prop1("интерфейс: свойство");
ipp.Prop2 ("интерфейс: свойство",77);
}
При множественном наследовании классов возникает ряд проблем. Они остаются и при множественном наследовании интерфейсов, хотя становятся проще. Рассмотрим две основные проблемы - коллизию имен и наследование от общего предка.