Як викликати private метод класу, що знаходиться в іншому модулі
Іноді виникає необхідність викликати private метод іншого класу, розташованого в іншому модулі. Це суперечить принципам ООП, закладеним в Delphi, але все-таки спробуємо це зробити. Для прикладу розглянемо випадок, коли потрібно зберегти / прочитати всі властивості об'єкта спадкоємця TPersistent. наприклад об'єкта класу TFont.
У Delphi є стандартні класи TReader, TWriter розроблені для збереження / читання властивостей об'єкта. У цих класах нам цікаві методи TWriter.WriteProperties (Instance: TPersistent) і TReader.ReadProperty (AInstance: TPersistent). Метод WriteProperties дозволяє зберегти в потік всі властивості об'єкта спадкоємця TPersistent. Виклик в циклі методу ReadProperty дозволяє прочитати з потоку всі збережені раніше властивості.
Розглянемо збереження властивостей.
У Delphi5 все просто. Обьявление методу WriteProperties знаходиться в Protected секції класу TWriter. Викликати його особливих проблем не складе:
додамо кілька додаткових перевірок для підвищення надійності цієї коду
В результаті ми отримали код, який можна використовувати для збереження в потік / читання з потоку всіх властивості будь-якого об'єкта спадкоємця TPersistent.
Де його можна використовувати? Наприклад, можна запам'ятати TEdit.Font або TForm.Icon або TImage.Picture.
У чому переваги цього методу? Ми створили універсальні методи для збереження / читання всіх властивостей будь-якого об'єкта спадкоємця TPersistent. отримали невеликий за розміром код. І в кінцевому підсумку навчилися викликати private методи іншого класу.
У чому його недоліки? "Поганий стиль" програмування, в обхід принципів ООП. Тепер наш код неявним чином залежить від модуля classes.pas. Будь-яка зміна в модулі classes.pas. в об'єктах TWriter, TReader, в методах TWriter.WriteCollection, TReader.ReadCollection може узгодить до збоїв в роботі розробленого нами коду. Причому ми не зможемо побачити це на етапі компіляції програми, тільки в момент його роботи. Але чи часто ви зраджували і перекомпілювати модуль classes.pas. мені здається, що не дуже.
Весь код, наведений вище, ви можете отримати, завантаживши демонстраційний проект. Ви можете використовувати його на свій страх і ризик в своїх додатках. Але основне що я хотів вам показати - використовуючи нестандартні методи програмування можна домогтися цікавих результатів, навіть викликати private метод класу знаходиться в іншому модулі.