Белешка
Приступ овој страници захтева ауторизацију. Можете покушати да се пријавите или промените директоријуме.
Приступ овој страници захтева ауторизацију. Можете покушати да промените директоријуме.
Белешка
Интересне групе заједнице сада су прешле са Иаммер-а на < ДИЦТ__Мицрософт ⚐ Вива ⚐ Енгаге > Мицрософт Вива Енгаге . Да бисте се придружили < ДИЦТ__Вива ⚐ Енгаге > Вива Енгаге заједници и учествовали у најновијим дискусијама, попуните образац &лт;c0&гт;Захтев за приступ финансијама и операцијама < ДИЦТ__Вива ⚐ Енгаге > Вива Енгаге заједници&лт;/c0&гт; и изаберите заједницу којој желите да се придружите.
Овај чланак описује коришћење атрибута у X + +.
Атрибут је неапстрактна класа која се протеже (наслеђује од) СyсАттрибуте класе. Атрибути представљају или чувају метаподатке о типовима и методама. Можете приложити атрибут класи, пољу класе, методу класе, интерфејсу или табели.
Примените атрибуте руковаоцима делегата и методама за мапирање руковаоца на те циљеве.
Креирање класе атрибута
Класа атрибута може проширити СyсАттрибуте класу директно, или може проширити било који потомак СyсАттрибуте класе. Не можете користити СyсАттрибуте класу као атрибут јер је декларисана апстрактно . Следећи пример приказује декларацију и дизајн обичне класе атрибута коју можете креирати.
public class PracticeAttribute extends SysAttribute
{
// Fields in the classDeclaration.
StartEnd startEndEnum;
str reason;
// Constructor.
public void new(StartEnd _startEndEnum, str _reason)
{
startEndEnum = _startEndEnum;
reason = _reason;
}
// Other methods can go here.
}
Декорисање класе са атрибутом
Следећи пример приказује класу и метод који су украшени са ПрацтицеАттрибуте датим у претходном примеру. Ако конструктор атрибута не узима параметре, заграде за параметре су опционе. Атрибут декорација може бити [AnotherAttribute] без заграда.
[PracticeAttribute(StartEnd::End, "Use the RegularClass class at the end.")]
public class RegularClass
{
[PracticeAttribute(Startend::Start, "Use the rehearse method at the start.")]
public int rehearse()
{
// Logic goes here.
}
// More fields and methods belong here.
}
Можете изоставити суфикс имена атрибута ако је Attribute суфикс . На пример, можете користити [Practice] уместо тога [PracticeAttribute] у претходном примеру.
Конструктори атрибута
Можете омогућити класи атрибута да складишти прилагођене метаподатке сваки пут када украшава класу тако што ће њен конструктор узети параметре. Параметри за конструктор морају бити буквали примитивних типова, као што су инт, енум или стр . Компајлер не конструише инстанцу класе атрибута. Он чува име класе атрибута, плус буквалне вредности за његов конструктор. Стога , ако би логика у конструктору атрибута бацила изузетак, украшавање класе са атрибутом не изазива изузетак. Изузетак се налази касније када процес гледа на класу да види атрибут са којим је украшен. Тај процес је када је атрибут конструисан.
Конвенције о именовању
Све класе атрибута имају суфикс Атрибут у свом имену. Суфикс Атрибут је конвенција имена коју Мицрософт препоручује, али то није системски захтев. Можете одредити да ли се класа протеже директно из СyсАттрибуте тако што ћете изабрати класу у Апплицатион Екплорер-у и прегледати Екстерни особину у прозору Пропертиес .
СyсОбсолетеАттрибуте
Систем обезбеђује неколико атрибута, укључујући и СисОбсолетеАттрибуте класу. Једна употреба класе СyсОбсолетеАттрибуте је да обавести компајлер да компајлирање треба да пропадне ако се одређени метод позове у изворном коду. Компајлер одбацује компајлирање, и приказује специфичну поруку која је смештена у овој употреби атрибута. СyсОбсолетеАттрибуте класа се такође може користити да обавести компајлер да издаје поруке упозорења уместо грешака.
СyсОбсолетеПример кода атрибута
[SysObsoleteAttribute("The Automobile class might have faster performance.", false)]
class Bicycle
{
// Members of the Bicycle class go here.
}
Рефлексија метаподатака
Користите рефлексију да бисте пронашли метаподатке атрибута који су везани за класу. Класе које се користе за рефлексију атрибута су следеће:
- ДицтЦласс цласс – За класе и интерфејсе.
- ДицтМетход класа – За методе на класама, интерфејсима или табелама.
На претходним класама рефлексије, методе за размишљање о метаподацима атрибута су следеће:
- гетАллАттрибутес метод
- гетАттрибуте метод
- гетАттрибутедЦлассес метод
- гетАттрибутес метод
Белешка
Не постоји механизам за навођење свих метода или класа које су украшене одређеним атрибутом из X + + кода. Међутим , пошто Кс + + компајлер бележи ове информације у бази података унакрсних референци, можете минирати ове информације одатле.
Пример кода рефлексије метаподатака
Користите класу ДицтМетход да бисте пронашли вредност метаподатака атрибута који украшава метод. Следећи пример кода користи класу СyсЕнтрyПоинтАттрибуте као атрибут. Прихвата вредности параметара за име методе, и за име класе која садржи метод. ПармЦхецкед метод је специфичан за СyсЕнтрyПоинтАттрибуте класу, и није наслеђен од своје основне класе СyсАттрибуте . Свака класа атрибута може имати своје име методе за своје метаподатке.
static public int MetadataOfSysEntryPointAttributeOnMethod
(
str _sNameOfClass,
str _sNameOfMethod
)
{
// Return Values:
// 0 == Has the attribute, its metadata value is false;
// 1 == Has the attribute, its metadata value is true;
// 2 == The method lacks the SysEntryPointAttribute.
int nReturnValue = -1,
nClassId;
boolean boolParmChecked;
DictMethod dm;
Object attributeAsObject;
SysEntryPointAttribute sepAttribute;
Global::info("Starting AttributeReflection"
+ " ::MetadataOfSysEntryPointAttributeOnMethod ....");
Global::info(strFmt
("Parameters are: _sNameOfClass = %1 , _sNameOfMethod = %2 .",
_sNameOfClass, _sNameOfMethod)
);
nClassId = Global::className2Id(_sNameOfClass);
dm = new DictMethod
(UtilElementType::ClassInstanceMethod,
nClassId,
_sNameOfMethod
);
attributeAsObject = dm.getAttribute("SysEntryPointAttribute");
if (attributeAsObject is SysEntryPointAttribute)
{
sepAttribute = attributeAsObject as SysEntryPointAttribute;
boolParmChecked = sepAttribute.parmChecked();
if (boolParmChecked)
nReturnValue = 1;
else
nReturnValue = 0;
Global::info(
strFmt("Return value is %1.",
nReturnValue)
);
}
else
{
nReturnValue = 2;
Global::error("Object is not a SysEntryPointAttribute??");
}
return nReturnValue;
}
/*** Output displayed in the Infolog.
Message (05:03:22 pm)
Starting AttributeReflection ::MetadataOfSysEntryPointAttributeOnMethod ....
Parameters are: _sNameOfClass = CustCustomerService , _sNameOfMethod = create .
Return value is 1.
***/
/**************
// Simple AOT > Jobs job to run the method.
static void AttributeReflection33Job(Args _args)
{
AttributeReflection::MetadataOfSysEntryPointAttributeOnMethod
("CustCustomerService", "create");
}
**************/