Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Динамические и виртуальные методы

Delphi , Компоненты и Классы , Процедуры и функции

Динамические и виртуальные методы

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


type
  t = class
    function a : integer; {статический}
    function b : integer; virtual;
    function c : integer; dynamic;
    property i : integer read a; { ok }
    property j : integer read b; { ok }
    property k : integer read c;
    { ОШИБКА: type mismatch (несовпадение типа) }
  end;

Here's the translation of the text into Russian:

Прекрасный вопрос о функциях объектно-ориентированного программирования Delphi!

Код, который вы предоставили, пытается определить класс t с тремя методами: a, b и c. Метод a статический, метод b виртуальный, а метод c динамический. Класс также имеет три свойства: i, j и k.

Ошибка возникает при компиляции кода для свойства k, которое должно считывать из метода c. Ошибка сообщает о типе несовместимости, указывая на проблему с типом c по сравнению с ожидаемым.

Проблема здесь заключается в том, что динамические методы Delphi (заявленные с помощью ключевого слова dynamic) не генерируются автоматически, как виртуальные методы. Когда вы объявляете динамический метод, вам нужно предоставить его реализацию в конструкторе или методе Initialize.

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

Чтобы решить эту проблему, вам нужно будет реализовать метод c явно в классе-конструкторе или методе Initialize:

type
  t = class
    function a: integer; { статический }
    function b: integer; virtual;
    function c: integer; dynamic;

    property i: integer read a; { окей }
    property j: integer read b; { окей }

    procedure InitObject; override;
  end;

В этом примере метод InitObject переопределяется для реализации метода c. Таким образом, когда вы создаете объект типа t, его метод c будет инициализирован правильно.

Обратите внимание, что если вам нужно вызывать c полиморфически, как виртуальный метод, вам нужно объявить его как виртуальный:

function c: integer; virtual;

Таким образом, вы можете переопределять c в производных классах и вызывать его полиморфически.

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


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


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




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



:: Главная :: Процедуры и функции ::


реклама



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

Время компиляции файла: 2024-05-10 07:13:18
2024-05-19 11:53:22/0.006295919418335/0