2010-11-18 2 views
1

Я пытаюсь очистить предупреждения компилятора в приложении, которое я унаследовал. Один из наших классов наследует от TControl. Предупреждение, которое я получаю, это «Переобучение измененных скрывает элемент в базовом классе»Redeclaration скрывает элемент в базовом классе

«Изменено» - это защищенная процедура в TControl. Класс Я смотрю уже переопределен его с логическим свойством

property Changed : Boolean read FChanged write FChanged stored true;

Есть несколько вариантов, я исключил уже:

  1. Rename из «Изменено» к чему-то еще. Это не практический вариант, так как это свойство используется везде в приложении.

  2. Скрыть предупреждение, используя директивы компилятора. Я могу это сделать, но я бы предпочел выяснить, что означает предупреждение и как его исправить.

Так что мой вопрос:

1) Является ли это предупреждение действительно проблема? Каковы последствия «скрытия базового элемента»?

2) Как удалить предупреждение компилятора без переименования объекта или скрыть предупреждение?

Я использую Delphi 2010

[Edit: Там было несколько suggesions использования инструмента рефакторинга переименовать свойство обижая. Я решил это, так как инструмент рефакторинга вообще не работает на этой кодовой базе]

+3

Предупреждение действительно. Это означает, что вы не сможете вызвать 'TControl.Changed' из своего нового элемента управления. Ваш элемент управления должен вызвать это, чтобы уведомить себя и своего родителя о том, что его свойства были изменены. Они наблюдают за сообщением 'cm_Changed', которое отправляет этот метод. Подумайте о том, чтобы вместо этого использовать свою собственность 'Dirty'. (Кроме того, это похоже на странное свойство, которое нужно хранить в DFM, при загрузке нового экземпляра формы, действительно ли правильно сказать, что элемент управления изменился?) –

+0

Хорошая точка! Не знаю, почему он хранится. – awmross

ответ

5

Если ваша собственная «Измененная» также была процедурой, вы можете использовать директиву переопределения, чтобы сообщить компилятору, что вы добавляете функциональность в базовый метод Changed в TControl. Если ваша декларация отличается или вы хотите по какой-либо другой причине нарушить цепочку наследования, вы можете указать директиву reintroduce, чтобы сообщить компилятору, что вы, по сути, сломаете цепочку.

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

  1. Rename «Changed» к чему-то еще
  2. Скрыть предупреждение с помощью директив
  3. Дон» t наследовать от TControl

Я бы выбрал первый вариант. Поскольку вы используете Delphi 2010, вы можете использовать инструменты Refactoring в Delphi, чтобы переименовать свойство через ваше приложение, хотя я бы тщательно проверил изменения, прежде чем сделать их окончательными, потому что, возможно, они повлияют и на метод Changed в базовом классе. ..

+1

Не беспокойтесь о возможности переименования инструмента рефакторинга, случайно переименовав метод. Во-первых, этого не должно быть, потому что они относятся к разным вещам; это то, что отличает инструмент рефакторинга от простой находки и замены. И, во-вторых, если происходит неправильная вещь *, компилятор точно скажет вам, где каждая проблема, потому что код больше не будет компилироваться - вы не можете использовать свойство «Изменено» в контексте, где метод «Изменен» можно было бы ожидать. –

+0

Вы * не могли * добавить 'переопределение' в объявление, даже если' Changed' были методом. Метод в базовом классе не является виртуальным. –

+0

Инструмент рефакторинга не работает над моим проектом. Я просто попробовал, как вы предложили, и не переименовывает использование в других проектах в Project Group. – awmross

Смежные вопросы