Delphi 6: Принудительная ошибка компилятора при отсутствии методов абстрактного класса? - PullRequest
4 голосов
/ 25 июня 2010

Я использую Delphi Pro 6. Прямо сейчас, единственный способ узнать, отсутствует ли класс в абстрактном методе базового класса, - это дождаться, пока среда IDE выдаст «конструирующий экземпляр {производного класса}, содержащий абстрактный метод { base class.abstract имя метода} "предупреждение или ожидание метода абстрактной ошибки во время выполнения при попытке вызвать отсутствующий метод. Первого недостаточно, поскольку он находит предупреждения только для тех производных классов, которые действительно созданы в текущем проекте. Последнее просто больно.

Было бы намного лучше, если бы Delphi выводил фатальное предупреждение для всех классов, которые не объявляют / не реализуют абстрактный метод базового класса немедленно. Кто-нибудь знает способ настроить это или плагин, который делает это?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 26 июня 2010

Класс, содержащий абстрактные методы, опасен только в том случае, если вы создаете экземпляр класса, поэтому предупреждение Delphi является точным. Исключение времени выполнения абстрактной ошибки появляется только в том случае, если вы проигнорировали хотя бы один «экземпляр класса с абстрактными методами».

2 голосов
/ 26 июня 2010

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

{$IFDEF CheckAbstracts}
initialization
  TSubclass1.Create(params);
  TAbstactClass1.Create(params); // Gives constructing instance of {derived class} containing abstract method warning
{$ENDIF}

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

1 голос
/ 25 июня 2010

Допустимо не реализовывать эти методы. Возможно, вы намереваетесь реализовать абстрактный метод в еще одном подтипе.

В более поздней версии Delphi / Win32 (я не помню, какая) были введены формальные классы abstract, которые дают понять, когда вы это делаете, и не намерены создавать экземпляр типа. Если вы строго придерживаетесь этой возможности, то запрашиваемая вами функция будет иметь смысл. Но для D6 это не понятно.

...