
- •Лекции по курсу "Технология программирования" (1-й семестр) Оглавление
- •Технология .Net Предыдущее состояние дел.
- •Главные компоненты платформы .Net (clr, cts и cls)
- •Общеязыковая среда выполнения (clr)
- •О бщая система типов и общеязыковые спецификации (cts и cls)
- •Библиотека базовых классов
- •Роль языка с#
- •Компоновочные блоки
- •Роль метаданных типов .Net
- •Роль манифеста компоновочного блока
- •Общая система типов.
- •Объектно-ориентированное программирование
- •Главные элементы объектно-ориентированного подхода
- •Дополнительные элементы ооп
- •Принципы объектно-ориентированного программирования.
- •Классы Инкапсуляция
- •Объект (экземпляр класса).
- •Ключевое слово this
- •Отношения между объектами.
- •Основные отличительные особенности класса
- •Спецификаторы доступа
- •Состав класса
- •Поля класса
- •Доступ к полям
- •Статические и экземплярные переменные
- •Методы (функции-члены класса)
- •Переменное число параметров метода
- •Статические методы
- •Конструкторы
- •Закрытые конструкторы или классы без экземпляров
- •Статические конструкторы.
- •Деструкторы
- •Абстрактные методы и классы.
- •Свойства
- •Индексаторы
- •Статические классы
- •Частичные классы
- •Рекомендации по программированию
- •Наследование Понятие наследования в программировании
- •Типы наследования
- •Наследование реализации
- •Определение наследующих классов
- •Уровень доступа protected и internal
- •Ссылка на объект базового класса
- •Протоклассы
- •Предотвращение наследования с помощью ключевого слова sealed.
- •Отношения между классами
- •Абстрактные классы.
- •Класс object
- •Функциональные замыкания
- •Разработка функциональных замыканий с помощью наследования
- •Разработка функциональных замыканий с помощью экземпляров класса
- •Заключение.
- •Полиморфизм
- •Полиморфизм наследующих классов.
- •Переопределение методов родительского класса. Раннее связывание.
- •Виртуальные методы и их переопределение.
- •Как вызывают виртуальные методы
- •Виртуальные функции и принцип полиморфизма
- •Перегрузка.
- •Перегруженные конструкторы
- •Рекомендации программисту.
Ключевое слово this
Все объекты одного и того же класса используют один и тот же экземпляр каждой операции. Это означает, что увеличение количества объектов некоторого класса не приводит к увеличению количества загруженного программного кода. Объект, из которого вызвана операция, передается ей в качестве ее неявного аргумента (параметра this). В отличие от операций, каждый объект одного и того же класса содержит свою собственную копию полей данных этого класса.
Методы класса находятся в памяти в единственном экземпляре и используются всеми объектами совместно, поэтому необходимо обеспечить работу методов нестатических экземпляров с полями именно того объекта, для которого они были вызваны. Для этого в любой нестатический метод автоматически передается скрытый параметр this, в котором хранится ссылка на вызвавший функцию экземпляр. В явном виде параметр this применяется для того, чтобы предоставить методу ссылку на вызвавший объект, а также для идентификации поля в случае, если его имя совпадает с именем параметра метода, например:
class Demo
{
double у;
public Demo() { return this; }// метод возвращает ссылку на экземпляр
public void Sety( double у ) { this.у = у; }
}
Отношения между объектами.
Между объектами можно устанавливать различные зависимости. Эти зависимости выражают связи или отношения между классами указанных объектов. Отношения двух любых объектов основываются на знаниях, которыми они обладают друг о друге: об операциях, которые можно выполнять, и об ожидаемом поведении.
Различают следующие типы отношений между объектами.
Связи.
Агрегация
В отношении связь объекты могут выполнять различные роли:
активный объект (actor) – это такой объект, который может воздействовать на внешнее окружение, но никогда не способен воспринимать внешние воздействия (активный объект).
Сервер или исполнитель (server) - подвергается воздействию со стороны других объектов, но сам никогда не активен.
Агент или посредник (agent, broker) - выполняет роль как активного объекта, так и исполнителя (сервера) и, как правило, создается в интересах активного объекта.
Связь типа агрегация это отношение типа часть-целое (a part-of). Позволяет, идя от целого (агрегата), прийти к его частям (атрибутам). По смыслу, агрегация может означать физическое вхождение в состав одного объекта других объектов. Но может быть и другая семантика, например, принадлежность одного объекта другому.
Основные отличительные особенности класса
Как можно понять из всего вышесказанного, класс, как и другие типы, представляет собой основу для перевода абстрактного представления объекта в тип, определяемый пользователем. Он сочетает в себе представление данных и методы обработки этих данных. Однако, от других типов, определяемых пользователем, его отличает то, что в нем реализованы все основные принципы ООП, заключающихся в следующем:
Инкапсуляция;
Наследование;
Полиморфизм.
Инкапсуляция в классе.
Как правило, под инкапсуляцией понимают объединение данных (атрибутов) и функций (методов), определяющих поведение объектов. Объекты имеют возможность скрывать свою реализацию от других объектов. Это особенность называется сокрытием информации. Несмотря на то, что некоторые объекты могут взаимодействовать друг с другом, но они ничего не знают о реализации друг друга. Как правило, подробности реализации скрыты в самих объектах.
Класс можно сравнивать со схемой, в которой описан состав функциональных блоков и компонент и связи между ними. Располагая такой схемой можно создавать реальные экземпляры класса, называемые объектами. По аналогии, например, все телевизоры, определенной марки, изготавливаются заводом по одной и той же схеме. В данном случае схему телевизора можно рассматривать как класс, а каждый конкретный телевизор – как экземпляр или объект этого класса. Несмотря на то, что все они одинаково устроены, тем не менее, каждый из них уникален в том смысле, что отличается настройкой выбранного канала, звука, цвета и т.д.
Описание класса содержит ключевое слово class, за которым следует его имя, а далее в фигурных скобках — тело класса. Кроме того, для класса можно задать его базовые классы (предки) и ряд необязательных атрибутов и спецификаторов, определяющих различные характеристики класса.
Формально класс описывается следующим образом:
[ атрибуты ] [ спецификаторы ] class [имя_класса] [ : предки ]
{
Тело класса: описание данных и методов …
}
На следующем примере покажем процесс создания класса, который можно рассматривать еще и как спецификацию объекта или совокупность требований к объекту. А поскольку это не сам объект, а только его "чертеж", то память для него не выделяется.
namespase MyExample
{
public class Circle
{
int x, y; //положение центра окружности
int r; //радиус
int thick; //толщина контура
Color color;// цвет контура
// Функция конструктора (инициализация переменных класса)
public Circle(int x, int y)
{
this.x=x;
this.y=y;
rad=50;
thick=3;
color=Color.Black;
}
public void Move(int dx, int dy) // Функция перемещения окружности
{
x+=dx; y+=dy;
}
public void Display(Graphics g) // Функция вырисовывания самой себя
{
Pen pen=new Pen(color, thick); //Создание объекта "пера"
// Рисование окружности заданной толщины и цвета
g.DrawEllipse(pen, x-r, y-r, x+r, y+r);
pen.Dispose(); // Удаление объекта "пера"
}
}
…
}
После объявления класса можно уже создавать его реальные экземпляры следующим образом:
…
Circle c1=new Circle(50, 50),
c2=new Circle(100, 100),
c3=new Circle(150, 150);
…
В этом примере объявлены 3 переменные с1, с2 и с3 типа Circle, и с помощью оператора new созданы их соответствующие экземпляры типа окружности (т.е. выполнена их реализация). Каждый из трех созданных объектов (с1, с2 и с3) одинаковы с точки зрения программной реализации, но каждый экземпляр располагает своим набором данных, которые может обрабатываться отдельно от данных в другом экземпляре. Связь с каждым экземпляром класса осуществляется через его открытые функции-члены (методы). Однако, воспользоваться ими можно только после создания экземпляра класса.
Для каждого объекта при его создании в памяти выделяется отдельная область, в которой хранятся его данные. В классе могут присутствовать статические элементы, которые существуют в единственном экземпляре для всех объектов класса. Статические данные часто называют данными класса, а остальные — данными экземпляра. Для работы с данными класса используются статические методы класса, для работы с данными экземпляра — методы экземпляра, или просто методы.
Все классы библиотеки .Net, а также все классы, которые создает программист в среде .Net, имеют одного общего предка – класс object.