Иногда требуется добраться до свойства, которое недоступно на том основании, что на него установлен доступ protected. В VCL эта необходимость возникает довольно часто при попытке реализовать групповую обработку объектов разных классов, имееющих одного предка. Например, есть список (TList) совершенно различных элементов управления, у которых нужно поменять Color. Идея вроде бы понятна - привести к общему базовому классу TControl и установить нужное значение. Но тут возникает препятствие: до свойства Color добраться нельзя - оно protected. Решение состоит в том, чтобы создать производный класс с открытым Color. Это несколько незаконно, но работает. В примере предполагается, что в списке все объекты строго являются экземплярами классов, производных в конечном счете от TControl. Исходный код:
void __fastcall TMyForm::SetColor(TList* List,TColor Color) { class TPublicColorControl : public TControl { public: property Color; };
for (int i = List->Count; i--; ) { TPublicColorControl* Control = reinterpret_cast<TPublicColorControl*>(List->Items[i]); Control->Color = Color; } }
|
|