Ключевое слово 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.