property System и abstract-ый Класс

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Юрий
новенький
Сообщения: 11
Зарегистрирован: 03.04.2022 02:32:16

property System и abstract-ый Класс

Сообщение Юрий »

Добрый день всем

Портирую относительно большой проект с Delphi2007
Наткнулся в двух местах на "неприятность" с названием проперти "System"

В коде ниже, всё валидно, но вылетает
Error: Illegal qualifier
либо
Error: identifier idents no member “AbstractError”.
и без указания модуля и строки (что было ужасно и ушло много времени чтоб найти где)

Код: Выделить всё

  TxxxSystem1 = class(TObject)
  private
    fSystem: Int64;
  public
    property Sysxxx: Int64 read fSystem;
    property System: Int64 read fSystem;                // Строка1
  end;

  TxxxSystem2 = class(TxxxSystem1)
  public
    procedure MetodAbstractxxxx; virtual; abstract;     // Строка2
  end;

При удалении либо Строки1 либо Строки2 всё компилируется :(

Переименование свойства влечёт за собой фатальные изменения, т.к находится в базовых классах от которых все зависят, и в текущей ситуации неприемлемо
Если убрать abstract;, и использовать пустышку то компилируется, но становится много мусора в модуле и класс становится не Абстрактным :(

Есть ли какие другие способы обойти это?
Awkward
новенький
Сообщения: 53
Зарегистрирован: 18.01.2017 23:06:47

Сообщение Awkward »

Кроме как писать - перешерстить код
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Похоже на глюк компилятора.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Юрий оформи багрепорт
DedFrend
постоялец
Сообщения: 157
Зарегистрирован: 25.11.2018 11:21:50

Сообщение DedFrend »

А зачем вам нужна абстрактность? Обычно это просто дополнительная страховка, чтобы не создавать экземпляры базового класса.
И что означает "много мусора" ?

Добавлено спустя 1 час 41 минуту 42 секунды:
Не поленился сам скомпилировать.
Поразительно, но факт! Конфликт вызывает имя system у свойства и только если у производного класса (можно даже в другом потомке) есть абстрактный метод. Остальное не имеет значения.
Юрий
новенький
Сообщения: 11
Зарегистрирован: 03.04.2022 02:32:16

Сообщение Юрий »

Awkward писал(а):Кроме как писать - перешерстить код


&System - не помогает, не компилится

Добавлено спустя 7 минут 24 секунды:
zub писал(а):Юрий оформи багрепорт


Попоробую сделать
Я правильно думаю что это здесь
https://gitlab.com/freepascal.org/
?

Нашел там связаный баг (Как мне кажется...)
https://gitlab.com/freepascal.org/fpc/source/-/issues/32538

Код: Выделить всё

TAbstractClass = class
   function GetLocation (system: TObject): TPoint; virtual; abstract;
end;

Висит там уже 4года, есть подозрение что разработчикам не до этогого... :lol: , поэтому не уверен что багрепорт что либо изменит...

Добавлено спустя 17 минут 55 секунд:
[quote="DedFrend"]А зачем вам нужна абстрактность? Обычно это просто дополнительная страховка, чтобы не создавать экземпляры базового класса.
И что означает "много мусора" ?

>>А зачем вам нужна абстрактность?
Ну как бы вам сказать...
Портирую проект, в проекте использована довольно большая библиотека ~116т.сток кода, написаная в прошлом веке, вот и я сижу и думаю зачем там абстракность....
Я как бы стараюсь не думать над филосовкими вопросами такой категории...,
мне всего лишь нужно портировать с наименьшими правками, потерями времени, функционала, качества, хотелось бы чтоб осталась совместимось с Delphi

>>И что означает "много мусора" ?
Удаляешь abstract; и генеришь пустой виртуальный метод, такак их там очень много , образуется много пустышек-мусора
DedFrend
постоялец
Сообщения: 157
Зарегистрирован: 25.11.2018 11:21:50

Сообщение DedFrend »

Удаляешь abstract; и генеришь пустой виртуальный метод, такак их там очень много , образуется много пустышек-мусора

наплевать и забыть. они в потомках сразу будут перекрыты и все будет как было
Сквозняк
энтузиаст
Сообщения: 1159
Зарегистрирован: 29.06.2006 22:08:32

Сообщение Сквозняк »

Использовать в паскале имя равное имени главного модуля, это закладывать под проект мину. Нужно срочно прошерстить проект поисковиком и заменить все System на что-то типа Sys123tem.
sts
энтузиаст
Сообщения: 537
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

Юрий писал(а):Нашел там связаный баг (Как мне кажется...)
https://gitlab.com/freepascal.org/fpc/s ... sues/32538

судя по свежему ответу там все плохо

Добавлено спустя 17 минут 52 секунды:
Сквозняк писал(а):Использовать в паскале имя равное имени главного модуля, это закладывать под проект мину.

это тест на адекватность компилятора, такие косяки в работе пространств имен недопустимы.
ведь это надо еще суметь так криво написать менеджер пространств имен.
Ответить