Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

2.8. Локальные, вложенные и анонимные классы в языках программирования

Лекция



Привет, сегодня поговорим про вложенный класс, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое вложенный класс, локальные классы, вложенные классы , настоятельно рекомендую прочитать все из категории С++ (C plus plus).

В объектно-ориентированном программировании (ООП) внутренний класс или вложенный класс - это класс, полностью объявленный в теле другого класса или интерфейса. Он отличается от подкласса . Экземпляр обычного класса может существовать сам по себе. В отличие от него, экземпляр внутреннего класса не может существовать без привязки к классу верхнего уровня.

Класс может быть объявлен внутри блока, например, внутри определения функции. Такой класс называется локальным. Локализация класса предполагает недоступность его компонентов вне области определения класса (вне блока).

Локальный класс не может иметь статических данных, т.к. компоненты локального класса не могут быть определены вне текста класса. Внутри локального класса разрешено использовать из объемлющей его области только имена типов, статические (static) переменные, внешние (extern) переменные, внешние функции и элементы перечислений. Из того, что запрещено важно отметить переменные автоматической памяти. Существует еще одно важное ограничение для локальных классов – их компонентные функции могут быть только inline.

Внутри класса разрешается определять типы, следовательно, один класс может быть описан внутри другого. Такой класс называется вложенным. Вложенный класс является локальным для класса, в рамках которого он описан, и на него рапространяются те правила использования локального класса, о которых говорилось выше. Следует особо сказать, что вложенный класс не имеет никакого особого права доступа к членам охватывающего класса, то-есть он может обращаться к ним только через объект типа этого класса(так же как и охватывающий класс не имеет каких-либо особых прав доступа к вложенному классу).

Обозначение на диаграммах UML внутреннего класса

Внутренние (вложенные) классы представлены в UML ассоциацией , украшенной скрещенным кругом.

Иллюстрация:

2.8. Локальные, вложенные  и анонимные классы в языках программирования

Анонимный внутренний класс показан как вложенный класс, которому дается «анонимный» стереотип, а также дается имя интерфейса, который он реализует.

Назначение и объяснение

Экземпляр нормального класса или класса верхнего уровня может существовать сам по себе. Напротив, экземпляр внутреннего класса не может быть создан без привязки к классу верхнего уровня.

Возьмем абстрактное понятие a Carс четырьмя Wheels. У наших Wheels есть особенность, которая зависит от того, чтобы быть частью нашего Car. Это понятие не представляет Wheels как Wheels в более общей форме, которые могли бы быть частью любого транспортного средства. Вместо этого он представляет их как специфические для Car. Мы можем смоделировать это понятие с помощью внутренних классов следующим образом:

У нас высший класс Car. Экземпляры класса Carсостоят из четырех экземпляров класса Wheel. Эта конкретная реализация Wheelспецифична для автомобиля, поэтому код не моделирует общее понятие колеса, которое лучше было бы представить как класс верхнего уровня. Следовательно, он семантически связан с классом, Carа код Wheelкаким-то образом связан с его внешним классом, являющимся составной единицей автомобиля. Колесо для конкретного автомобиля уникально для этого автомобиля, но для обобщения колесо - это агрегат для автомобиля.

Внутренние классы предоставляют механизм для точного моделирования этого соединения. Мы можем обратиться к нашему Wheelклассу , как Car.Wheel, Carбудучи классом верхнего уровня и Wheelявляются внутренним классом.

Таким образом, внутренние классы допускают объектную ориентацию определенных частей программы, которые в противном случае не были бы инкапсулированы в класс.

Более крупные сегменты кода внутри класса можно было бы лучше смоделировать или реорганизовать как отдельный класс верхнего уровня, а не как внутренний класс. Это сделало бы код более общим в применении и, следовательно, более пригодным для повторного использования, но потенциально могло бы быть преждевременным обобщением. Это может оказаться более эффективным, если в коде есть много внутренних классов с общей функциональностью.

Типы вложенных классов в Java

В Java есть четыре типа вложенных классов:

Статический

  • Статические классы-члены, также называемые статическими вложенными классами - они объявлены static. Как и другие объекты в статической области видимости (т.е. статические методы ), они не имеют включающего экземпляра и не могут получить доступ к переменным экземпляра и методам включающего класса. Об этом говорит сайт https://intellect.icu . Они почти идентичны невложенным классам, за исключением деталей области видимости (они могут ссылаться на статические переменные и методы включающего класса без уточнения имени; другие классы, которые не являются одним из его включающих классов, должны уточнять свое имя с помощью его включающего класса имя). Вложенные интерфейсы неявно статичны.

Нестатические / внутренние классы

Внутренний класс - следующие категории называются внутренними классами . Каждый экземпляр этих классов имеет ссылку на включающий экземпляр (т. Е. Экземпляр включающего класса), за исключением локальных и анонимных классов, объявленных в статическом контексте. Следовательно, они могут неявно ссылаться на переменные экземпляра и методы включающего класса. Ссылку на включающий экземпляр можно явно получить через EnclosingClassName.this. Внутренние классы не могут иметь статических переменных или методов, за исключением переменных-констант времени компиляции. Когда они создаются, они должны иметь ссылку на экземпляр включающего класса; это означает, что они должны быть созданы в методе экземпляра или конструкторе включающего класса, либо (для членов и анонимных классов) должны быть созданы с использованием синтаксиса enclosingInstance.new InnerClass().

  • Класс-член - они объявляются вне функции (следовательно, «член») и не объявляются «статическими».
  • Локальный класс - это классы, объявленные в теле функции. На них можно ссылаться только в остальной части функции. Они могут использовать локальные переменные и параметры функции, но только те, которые объявлены "окончательными". (Это связано с тем, что экземпляр локального класса должен поддерживать отдельную копию переменной, так как он может переживать функцию; чтобы не путать две изменяемые переменные с одним и тем же именем в одной и той же области, переменная принудительно быть немодифицируемым.) Может быть очень полезным для создания класса с полями универсального типа, где переменные типа определены в методе.
  • Анонимный класс - это локальные классы , которые автоматически объявляются и создаются в середине выражения. Они могут напрямую расширять только один класс или реализовывать один интерфейс. Они могут указывать аргументы конструктору суперкласса, но в противном случае не могут иметь конструктор (однако это не ограничение, поскольку он может иметь блок инициализатора экземпляра для выполнения любой инициализации).

2.8. Локальные, вложенные  и анонимные классы в языках программирования

Пример объявления внутреннего нестатического класса в Java

 2.8. Локальные, вложенные  и анонимные классы в языках программирования 

Пример объявления вложенного статического класса

2.8. Локальные, вложенные  и анонимные классы в языках программирования

Рис Создание локального класса .

Создание описанного локального класса возможно только внутри самого метода строго ниже кода объявления самого класса. Пример кода создания: InnerLocalClass innerLocal = new InnerLocalClass();

2.8. Локальные, вложенные  и анонимные классы в языках программирования

Рис анонимный , безимянный класс

Примеры в языке С++

Пример 2.8.1

int i;

class global{

static int n;

public:

int i;

static float f;

class intern{

void func(global& glob)

{i=3; // Ошибка: используется имя нестатического данного

// из охватывающего класса

f=3.5; // Правильно: f-статическая функция

::i=3; // Правильно: i-внешняя(по отношению к классу)

// переменная

glob.i=3; // Правильно: обращение к членам охватывающего

// класса через объект этого класса

n=3; // Ошибка: обращение к private-члену охватывающего

//класса

} }; };

Пример 2.8.2

//Класс “ПРЯМОУГОЛЬНИК”.

//Определим класс “прямоугольник”. Внутри этого класса определим класс как //вложенный класс “отрезок”. Прямоугольник будет строится из отрезков.

#include

#include

// точка

class point{

protected:

int x,y;

public:

point(int x1=0,int y1=0):x(x1),y(y1){}

int& getx(){return x;}

int& gety(){return y;}

};

// прямоугольник

class rect{

// вложенный клас “отрезок”

class segment{

point a,b; //начало и конец отрезка

public:

segment(point a1=point(0,0),point b1=point(0,0))

{a.getx()=a1.getx();

a.gety()=a1.gety();

b.getx()=b1.getx();

b.gety()=b1.gety();}

point& beg(){return a;}

point& end(){return b;}

void Show() //показать отрезок

{line(a.getx(),a.gety(),b.getx(),b.gety());}

}; //конец определения класса segment

segment ab,bc,cd,da; //стороны прямоугольника

public:

rect(point c1=point(0,0),int d1=0,int d2=0)

{point a,b,c,d; //координаты вершин

a.getx()=c1.getx();

a.gety()=c1.gety();

b.getx()=c1.getx()+d1;

b.gety()=c1.gety();

c.getx()=c1.getx()+d1;

c.gety()=c1.gety()+d2;

d.getx()=c1.getx();

d.gety()=c1.gety()+d2;

//граничные точки отрезков

ab.beg()=a; ab.end()=b;

bc.beg()=b; bc.end()=c;

cd.beg()=c; cd.end()=d;

da.beg()=d; da.end()=a;}

void Show() //пока прямоугольник

{ab.Show();

bc.Show();

cd.Show();

da.Show();}

}; //конец определения класса rect

void main()

{int dr=DETECT,mod;

initgraph(&dr,&mod,"C:\\tc3\\bgi");

point p1(120,80);

point p2(250,240);

rect A(p1,80,30);

rect B(p2,100,200);

A.Show();getch();

B.Show();getch();

closegraph();

}

Используя эту методику можно определить любую геометрическую фугуру, состоящую из отрезков прямых.

Пример 2.8.3

Класс “СТРОКА”

Класс string хранит строку в виде массива символов с завершающим нулем с стиле Си и использует механизм подсчета ссылок для минимизации ипераций копирования.

Класс string пользуеися тремя вспомогательными классами:

srep, который позволяет разделять действительное представление между несколькими объектами типа string с одинаковыми значениями;

range- для генерации исключения в случае выхода за пределы диапазона;

cref – для реализации операции индексирования, который различает операциичтения и записи.

class string{

struct srep;

srep* rep;

public:

class cref; //ссылка на char

class range{};

//…

};

Также как и другие члены, вложенный класс может быть объявлен в самом классе, а определен позднее.

struct string::srep{

char *s; //указатель на элементы

int sz; //количество символов

int n; //количество обращений

srep(const char *p)

{n=1;

sz=strlen(p);

s=new char[sz+1];

strcpy(s,p);

}

~srep(){delete[]s;}

srep *get_copy() //сделать копию,если необходимо

{if(n==1)return this;

n--;

return new srep(s);}

void assign(const char *p)

{if(strlen(p)!=sz){delete[]s;

sz=strlen(p);

s=new char[sz+1];}

strcpy(s,p);}

private: //предохраняет от копирования

sper(const srep&);

srep& operator=(const srep&);

}

Класс string обеспечивает обычный набор конструкторов, деструкторов и операторов присваивания.

вложенные классы в других языках программирования

  • Внутренние классы стали функцией языка программирования Java, начиная с версии 1.1.
  • Вложенные классы также являются функцией языка программирования D , Visual Basic .NET , Ruby , C ++ и C # .
  • В Python можно вложить класс в другой класс, метод или функцию.
  • В C ++ есть вложенные классы, похожие на статические классы-члены Java, за исключением того, что они не объявлены с помощью «static».
  • В языке BETA введено понятие вложенных классов.
  • В PHP 7 есть механизм описания анонимных классов, однако, в отличие от Java, анонимные классы не обязаны наследовать существующий класс или реализовывать существующий интерфейс, что достигается благодаря динамической природе языка. Пример:
  2.8. Локальные, вложенные  и анонимные классы в языках программирования

Применение вложенных классов для GUI

Локальные внутренние классы часто используются в Java для определения обратных вызовов для кода GUI. Затем компоненты могут совместно использовать объект, реализующий интерфейс обработки событий или расширяющий абстрактный класс адаптера, содержащий код, который будет выполняться при запуске данного события.

Анонимные внутренние классы также используются там, где код обработки событий используется только одним компонентом и, следовательно, не требует именованной ссылки.

Это позволяет избежать использования большого монолитного actionPerformed(ActionEvent)метода с несколькими ветвями if-else для определения источника события. Этот тип кода часто считается беспорядочным , а варианты внутреннего класса считаются лучшими во всех отношениях.

Вау!! 😲 Ты еще не читал? Это зря!

В общем, мой друг ты одолел чтение этой статьи об вложенный класс. Работы впереди у тебя будет много. Смело пиши комментарии, развивайся и счастье окажется в твоих руках. Надеюсь, что теперь ты понял что такое вложенный класс, локальные классы, вложенные классы и для чего все это нужно, а если не понял, или есть замечания, то не стесняйся, пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории С++ (C plus plus)

создано: 2015-12-20
обновлено: 2021-03-22
132419



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей



Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

С++ (C plus plus)

Термины: С++ (C plus plus)