Достъп до страницата със защитени свойства и методи

Сайт на Delphi: ежедневни Delphi-новини, документация, статии, преглед, интервю, компютърен хумор.

Неведнъж съм забелязвал, че разработчиците на Delphi понякога крият много полезни свойства и методи на компоненти в частния или защитения раздел. Разбирам, че те забраняват достъпа до тези свойства и методи, чието неправилно боравене може да доведе до срив на програмата. И все пак понякога достъпът до „забранения плод“ е просто необходим.

Как да получите достъп до защитена променлива или метод? Нека разгледаме проблем на пример на бутона. Компонентът TButton има метод SetButtonStyle, деклариран в защитената секция. Как да излъжете Delphi и да получите директен достъп до този метод? Ако напишете следния код в програма, ще възникне грешка по време на компилация:

Компилаторът Delphi има един недостатък (или може би добродетел, трудно е да се каже). Ако два обекта са декларирани в един и същи модул, тогава всичките им свойства и методи са достъпни един за друг. Няма значение къде точно в модула са декларирани тези методи и свойства и дали са защитени или не. Но в крайна сметка бутонът и нашият проект са декларирани в различни модули, така че тази функция изглежда безполезна на пръв поглед. Отделете време. Обектно-ориентираното програмиране има още една много полезна функция - наследяването. При наследяване всеки предшественик може да бъде присвоен на дете и кодът ще работи правилно.

Нека комбинираме тези две възможности, за да получим достъп до защитен метод. И така, в нашия модул за формуляри, ние декларираме нов клас, който ще идва от TButton. Декларацията изглежда така (трябва да е в секцията тип):

Сега можете да използвате защитените методи на бутона навсякъде в нашия модул. Да приемем, че имамеФормата има бутон Buttonl от тип TButton. Този обект е предшественик на TMyButton, така че TMyButton(Buttonl) е правилен. И тъй като класът TMyButton е деклариран в същия модул, можете лесно да получите достъп до неговите защитени методи и свойства. За да направите това, просто напишете кода:

Оказва се, че когато декларираме наследника от бутона, всичките му методи се преместиха в нашия модул. И тъй като в един модул всички класове са приятелски настроени и "виждат" всички защитени свойства и методи един на друг, лесно бихме могли да ги разчетем.

Този метод е добър само когато трябва да получите достъп до защитено (от защитения раздел) свойство или метод. Що се отнася до частните свойства и методи (декларирани в частната секция), всички те са недостъпни за наследниците, което означава, че не се прехвърлят към нашия модул.

ЗАБЕЛЕЖКА Изходният код за този пример се намира на компактдиска в директорията Sources\ch02\AccessToPrivate.