Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

"Нарушение принципов ООП в Delphi при использовании обработчиков сообщений"

Delphi , ОС и Железо , Справочник по сообщениям

Нарушение принципов ООП в Delphi при использовании обработчиков сообщений

При работе с языком программирования Object Pascal в среде Delphi иногда можно столкнуться с ситуациями, когда нарушаются принципы объектно-ориентированного программирования (ООП). Одной из таких ситуаций является поведение Delphi при использовании обработчиков сообщений в сочетании с наследованием классов.

Рассмотрим пример, который демонстрирует эту проблему. Допустим, у нас есть два класса: TBaseClass и TDerivedClass, определенные в отдельных единицах.

TBaseClass

unit InhPriv.BaseClass;

interface

uses Vcl.Controls, Winapi.Windows, Winapi.Messages, InhPriv.Messages;

type
  TBaseClass = class(TWinControl)
  strict private
    procedure TheMethod(var msg: TMessage); message WM_CUSTOM;
  end;

implementation

procedure TBaseClass.TheMethod(var msg: TMessage);
begin
  MessageBox(0, 'TBaseClass.TheMethod', 'IhheritedPrivateTest', 0);
end;

end.

TDerivedClass

unit InhPriv.DerivedClass;

interface

uses InhPriv.BaseClass, Winapi.Windows, Winapi.Messages, InhPriv.Messages;

type
  TDerivedClass = class(TBaseClass)
  public
    procedure TheMethod(var msg: TMessage); message WM_CUSTOM;
  end;

implementation

procedure TDerivedClass.TheMethod(var msg: TMessage);
begin
  inherited; //TBaseClass.TheMethod gets called!!!
  MessageBox(0, 'TDerivedClass.TheMethod', 'IhheritedPrivateTest', 0);
end;

end.

При нажатии на кнопку в главной форме мы отправляем сообщение WM_CUSTOM (определенное как WM_USER + 1) объекту c типа TDerivedClass. В результате вызываются оба метода: TBaseClass.TheMethod и TDerivedClass.TheMethod.

procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(c.Handle, WM_CUSTOM, 0, 0);
end;

По задумке автора, метод TBaseClass.TheMethod должен был остаться приватным и не должен был вызываться из класса-потомка. Однако, как мы видим, это не так. Причина кроется в особенностях работы обработчиков сообщений в Delphi.

Дело в том, что при использовании директивы message для определения метода как обработчика сообщений, Delphi автоматически генерирует код, который позволяет вызывать этот метод из любого места, независимо от его видимости. В данном случае, несмотря на то, что TBaseClass.TheMethod определен как приватный, он все равно вызывается из TDerivedClass.TheMethod через ключевое слово inherited.

Эта особенность поведения Delphi может нарушать принципы инкапсуляции и наследования, так как приватные методы базового класса становятся доступными в классах-потомках через обработчики сообщений.

В официальной документации Delphi об этом поведении ничего не сказано, но, судя по всему, это не является ошибкой компилятора, а скорее особенностью работы с обработчиками сообщений.

Подтвержденный ответ: При использовании обработчиков сообщений в Delphi могут нарушаться принципы ООП, в частности, приватные методы базового класса могут вызываться из классов-потомков через обработчики сообщений.

Альтернативный ответ: Данное поведение Delphi является особенностью работы с обработчиками сообщений и не является ошибкой компилятора.

Создано по материалам из источника по ссылке.

Нарушение принципов ООП в Delphi при использовании обработчиков сообщений: Несмотря на то, что метод в базовом классе был определен как приватный, он все равно вызывается из класса-потомка через обработчики сообщений.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по сообщениям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:47:48/0.0056028366088867/1