Перфолента.NET. ООП. Атрибуты элементов программы — различия между версиями
Админ (обсуждение | вклад) м |
Админ (обсуждение | вклад) м (→Применение атрибутов) |
||
(не показаны 2 промежуточные версии этого же участника) | |||
Строка 5: | Строка 5: | ||
Значение присвоенное атрибуту '''ИмяАтрибута''' процедуры '''ИмяПроцедуры''' сможет прочитать любая программа, которая обратится к программе содержащей процедуру '''ИмяПроцедуры''' т.е. внешняя программа прочитав значение атрибута ИмяАтрибута у процедуры ИмяПроцедуры получит значение "ЗачениеАтрибута" которое сможет использовать по своему усмотрению. | Значение присвоенное атрибуту '''ИмяАтрибута''' процедуры '''ИмяПроцедуры''' сможет прочитать любая программа, которая обратится к программе содержащей процедуру '''ИмяПроцедуры''' т.е. внешняя программа прочитав значение атрибута ИмяАтрибута у процедуры ИмяПроцедуры получит значение "ЗачениеАтрибута" которое сможет использовать по своему усмотрению. | ||
− | + | • [[Перфолента.NET. ООП. Как написать свой атрибут|Как написать свой атрибут]] | |
В языке Перфолента, как и в других .Net языках, атрибуты элементов программы используются: | В языке Перфолента, как и в других .Net языках, атрибуты элементов программы используются: | ||
Строка 12: | Строка 12: | ||
Это значит, что как компилятор может внести изменения в генерируемый машинный код основываясь на атрибутах, так и выполняющаяся программа может менять своё поведение в зависимости от атрибутов выполняемого кода. | Это значит, что как компилятор может внести изменения в генерируемый машинный код основываясь на атрибутах, так и выполняющаяся программа может менять своё поведение в зависимости от атрибутов выполняемого кода. | ||
− | Процесс получения атрибутов сборки и других элементов программы называется рефлексией (reflection). | + | Процесс '''получения''' атрибутов сборки и других элементов программы называется рефлексией (reflection). |
== Виды атрибутов == | == Виды атрибутов == | ||
Строка 19: | Строка 19: | ||
* выполнение кода программы | * выполнение кода программы | ||
− | Атрибуты | + | Атрибуты определены: |
* в библиотеке Net Framework и могут использоваться компиляторами любых .Net языков | * в библиотеке Net Framework и могут использоваться компиляторами любых .Net языков | ||
* в стандартной библиотеке Перфоленты и могут использоваться компилятором Перфоленты и программами, использующими эту библиотеку | * в стандартной библиотеке Перфоленты и могут использоваться компилятором Перфоленты и программами, использующими эту библиотеку | ||
Строка 33: | Строка 33: | ||
== Применение атрибутов == | == Применение атрибутов == | ||
− | + | Наиболее популярные и простые в использовании атрибуты: | |
− | * &ВидноВсем - к | + | |
− | * ОбщийДляКласса - [[Поле]] существует в 1-м экземпляре, для всех объектов данного типа (Класса) | + | * [[&ВидноВсем]] - атрибуты видимости классов и их членов, к полю, функции, методу, объекту - могут обращаться другие объекты |
+ | * [[&ОбщийДляКласса]] - [[Поле]] существует в 1-м экземпляре, для всех объектов данного типа (Класса) | ||
+ | * [[&ТолькоЧтение]], [[&ТолькоЗапись]] - атрибуты ограничения доступа к полям и свойствам объекта | ||
+ | * [[&ИмпортМетода]] – специальный атрибут метода, указывающий компилятору, что реализация метода находится во внешней библиотеке и имеет указанную сигнатуру | ||
Примеры использования: | Примеры использования: | ||
Класс Лампа | Класс Лампа | ||
// Поля класса | // Поля класса | ||
− | &ВидноВсем Поле Состояние тип Строка = "Выключена" // Переменная | + | &ВидноВсем |
+ | Поле Состояние тип Строка = "Выключена" // Переменная имеющая атрибут &ВидноВсем | ||
&ВидноВсем | &ВидноВсем | ||
− | Функция ИмяФункции | + | Функция ИмяФункции // Функция имеющая атрибут &ВидноВсем |
---- | ---- | ||
КонецФункции | КонецФункции | ||
Строка 51: | Строка 55: | ||
В язык Перфолента встроены следующие атрибуты: | В язык Перфолента встроены следующие атрибуты: | ||
− | * '''ВидноВсем''', '''ВидноСборке''', '''ВидноНаследникам''', '''ВидноНаследникамСборки''' - атрибуты видимости классов и их членов | + | * '''ВидноВсем''', '''ВидноСборке''', '''ВидноНаследникам''', '''ВидноНаследникамСборки''' - атрибуты видимости классов и их членов |
− | * '''ПространствоИмен'''("МоёПространство "), ПространствоИмён("МоёПространство") (синонимы) - атрибут класса, определяющий пространство имен, к которому принадлежит класс | + | * '''ПространствоИмен'''("МоёПространство "), ПространствоИмён("МоёПространство") (синонимы) - атрибут класса, определяющий пространство имен, к которому принадлежит класс |
− | * '''ОднопоточнаяМодель''', '''МногопоточнаяМодель''' - атрибуты метода Старт, определяющие модель взаимодействия для COM объектов | + | * '''ОднопоточнаяМодель''', '''МногопоточнаяМодель''' - атрибуты метода Старт, определяющие модель взаимодействия для COM объектов |
− | * '''ОбщийДляКласса''' - атрибут члена класса (Поля, Метода) делающий его общим для всех созданных экземпляров объектов этого класса | + | * '''ОбщийДляКласса''' - атрибут члена класса (Поля, Метода) делающий его общим для всех созданных экземпляров объектов этого класса |
− | * '''Глобальный''' - атрибут модуля, определяющий доступ всех видимых ко всем видимым членам модуля из всех других методов программы | + | * '''Глобальный''' - атрибут модуля, определяющий доступ всех видимых ко всем видимым членам модуля из всех других методов программы |
* '''Сериализуемый''' – атрибут класса, указывающий компилятору необходимость создать код поддержки сериализации данных класса; ссылка в вики на сериализация класса | * '''Сериализуемый''' – атрибут класса, указывающий компилятору необходимость создать код поддержки сериализации данных класса; ссылка в вики на сериализация класса | ||
− | * '''ДолженНаследоваться''', '''МожетНаследоваться''', '''НеМожетНаследоваться''' - атрибуты класса, определяющие возможность или необходимость его наследования | + | * '''ДолженНаследоваться''', '''МожетНаследоваться''', '''НеМожетНаследоваться''' - атрибуты класса, определяющие возможность или необходимость его наследования |
− | * '''ДолженПереопределяться''', '''МожетПереопределяться''', '''НеМожетПереопределяться''' - атрибуты члена класса (Поле, Метод,), определяющие возможность или необходимость его переопределения | + | * '''ДолженПереопределяться''', '''МожетПереопределяться''', '''НеМожетПереопределяться''' - атрибуты члена класса (Поле, Метод,), определяющие возможность или необходимость его переопределения |
− | * '''Переопределение''' - атрибут переопределения метода родителя в классе-наследнике | + | * '''Переопределение''' - атрибут переопределения метода родителя в классе-наследнике |
− | * '''Перекрытие''' - атрибут перекрытия метода родителя в классе-наследнике | + | * '''Перекрытие''' - атрибут перекрытия метода родителя в классе-наследнике |
− | * '''Перегрузка''' - атрибут перегрузки методов с одинаковыми именами | + | * '''Перегрузка''' - атрибут перегрузки методов с одинаковыми именами |
− | * '''ТолькоЧтение''', '''ТолькоЗапись''' - атрибуты ограничения доступа к полям и свойствам | + | * '''ТолькоЧтение''', '''ТолькоЗапись''' - атрибуты ограничения доступа к полям и свойствам |
− | * '''Обработчик'''("МоёСобытие") - атрибут метода класса (процедуры), определяющий, что метод является обработчиком указанного события | + | * '''Обработчик'''("МоёСобытие") - атрибут метода класса (процедуры), определяющий, что метод является обработчиком указанного события |
− | * '''ИмпортМетода''' – специальный атрибут метода, указывающий компилятору, что реализация метода находится во внешней библиотеке и имеет указанную сигнатуру | + | * '''ИмпортМетода''' – специальный атрибут метода, указывающий компилятору, что реализация метода находится во внешней библиотеке и имеет указанную сигнатуру |
Назначение и особенности использования встроенных атрибутов подробнее рассматриваются в тех статьях, где описаны сущности языка, к которым | Назначение и особенности использования встроенных атрибутов подробнее рассматриваются в тех статьях, где описаны сущности языка, к которым |
Текущая версия на 19:38, 12 ноября 2020
В языке Перфолента.Net можно привязать к элементам программы (модулям, полям, функциям) дополнительную информацию, которая придаст им дополнительный смысл, особое назначение или особые правила использования. У атрибута нет логики, он просто хранит несколько значений, что бы их можно было прочитать в будущем. Практический смысл создавать атрибуты есть тогда, когда есть необходимость из другой программы анализировать элементы текущей.
Фактически Атрибут - это метка которую можно прикрепить к полю, функции, методу, самой программе (сборке) или модулю программы (DLL) значение которой сможет прочитать другой компонент этой или другой программы:
Значение присвоенное атрибуту ИмяАтрибута процедуры ИмяПроцедуры сможет прочитать любая программа, которая обратится к программе содержащей процедуру ИмяПроцедуры т.е. внешняя программа прочитав значение атрибута ИмяАтрибута у процедуры ИмяПроцедуры получит значение "ЗачениеАтрибута" которое сможет использовать по своему усмотрению.
В языке Перфолента, как и в других .Net языках, атрибуты элементов программы используются:
- на стадии компиляции
- на стадии выполнения
Это значит, что как компилятор может внести изменения в генерируемый машинный код основываясь на атрибутах, так и выполняющаяся программа может менять своё поведение в зависимости от атрибутов выполняемого кода.
Процесс получения атрибутов сборки и других элементов программы называется рефлексией (reflection).
Содержание
Виды атрибутов
Итак, Атрибуты могут влиять на:
- сборку (компиляцию) программы
- выполнение кода программы
Атрибуты определены:
- в библиотеке Net Framework и могут использоваться компиляторами любых .Net языков
- в стандартной библиотеке Перфоленты и могут использоваться компилятором Перфоленты и программами, использующими эту библиотеку
- Вами в вашей программе и использовать их будете только Вы
Часть используемых вами атрибутов определена прямо в языке Перфолента (в стандартной библиотеке), это:
- видимости (ВидноВсем),
- наследования,
- переопределения методов
- и другие (ТолькоДляЧтения).
Важно: в языке 1С, как и в некоторых других языках программирования, атрибуты называют аннотациями. В разных языках синтаксис записи атрибутов (аннотаций) различен, как и способы их использования, но в большинстве современных языков они в том или ином виде есть.
Применение атрибутов
Наиболее популярные и простые в использовании атрибуты:
- &ВидноВсем - атрибуты видимости классов и их членов, к полю, функции, методу, объекту - могут обращаться другие объекты
- &ОбщийДляКласса - Поле существует в 1-м экземпляре, для всех объектов данного типа (Класса)
- &ТолькоЧтение, &ТолькоЗапись - атрибуты ограничения доступа к полям и свойствам объекта
- &ИмпортМетода – специальный атрибут метода, указывающий компилятору, что реализация метода находится во внешней библиотеке и имеет указанную сигнатуру
Примеры использования:
Класс Лампа // Поля класса &ВидноВсем Поле Состояние тип Строка = "Выключена" // Переменная имеющая атрибут &ВидноВсем
&ВидноВсем Функция ИмяФункции // Функция имеющая атрибут &ВидноВсем ---- КонецФункции
Встроенные атрибуты языка Перфолента
В язык Перфолента встроены следующие атрибуты:
- ВидноВсем, ВидноСборке, ВидноНаследникам, ВидноНаследникамСборки - атрибуты видимости классов и их членов
- ПространствоИмен("МоёПространство "), ПространствоИмён("МоёПространство") (синонимы) - атрибут класса, определяющий пространство имен, к которому принадлежит класс
- ОднопоточнаяМодель, МногопоточнаяМодель - атрибуты метода Старт, определяющие модель взаимодействия для COM объектов
- ОбщийДляКласса - атрибут члена класса (Поля, Метода) делающий его общим для всех созданных экземпляров объектов этого класса
- Глобальный - атрибут модуля, определяющий доступ всех видимых ко всем видимым членам модуля из всех других методов программы
- Сериализуемый – атрибут класса, указывающий компилятору необходимость создать код поддержки сериализации данных класса; ссылка в вики на сериализация класса
- ДолженНаследоваться, МожетНаследоваться, НеМожетНаследоваться - атрибуты класса, определяющие возможность или необходимость его наследования
- ДолженПереопределяться, МожетПереопределяться, НеМожетПереопределяться - атрибуты члена класса (Поле, Метод,), определяющие возможность или необходимость его переопределения
- Переопределение - атрибут переопределения метода родителя в классе-наследнике
- Перекрытие - атрибут перекрытия метода родителя в классе-наследнике
- Перегрузка - атрибут перегрузки методов с одинаковыми именами
- ТолькоЧтение, ТолькоЗапись - атрибуты ограничения доступа к полям и свойствам
- Обработчик("МоёСобытие") - атрибут метода класса (процедуры), определяющий, что метод является обработчиком указанного события
- ИмпортМетода – специальный атрибут метода, указывающий компилятору, что реализация метода находится во внешней библиотеке и имеет указанную сигнатуру
Назначение и особенности использования встроенных атрибутов подробнее рассматриваются в тех статьях, где описаны сущности языка, к которым применяются конкретные атрибуты