Можно ли в Visual Studio заставить компилятор выдавать сообщение о том, что переписанная виртуальная функция в наследованном классе не вызывает соответствующую функцию базового класса?
В свойствах проекта выставлен warning level 4, Visual Studio 2005
То есть, хотелось бы получить предупреждение в следующей ситуации:
class Animal
public virtual void Run()
{
// do something
}
class Dog:Animal
public override void Run()
{
base.Run(); // комментирование этой строчки вызывает предупреждение
// do something else
}
Re: сообщение компилятора на отсутствие вызова метода предка
Здравствуйте, Gary, Вы писали:
G>Можно ли в Visual Studio заставить компилятор выдавать сообщение о том, что переписанная виртуальная функция в наследованном классе не вызывает соответствующую функцию базового класса? G>В свойствах проекта выставлен warning level 4, Visual Studio 2005
Нет никаких проблем в твоем примере. Что-ты ты накасячил где-то еще.
На всякий случай скормил код компилятору. Проблем нет. Ну, если не считать, что ты у класса скобки не указал . Вот полный пример:
using System;
class Animal
{
public virtual void Run()
{
// do something
Console.WriteLine("Animal.Run()");
}
}
class Dog : Animal
{
public override void Run()
{
base.Run(); // OK
Console.WriteLine("Dog.Run()");
}
}
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
dog.Run();
}
}
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: сообщение компилятора на отсутствие вызова метода пре
VD>Нет никаких проблем в твоем примере. Что-ты ты накасячил где-то еще.
Вот именно в том и проблема, что нет проблем!
Я хочу, чтобы в случие отсутствия вызова базовой функции компилятор говорил об этом
class Animal
{
public virtual void Run()
{
// do something
Console.WriteLine("Animal.Run()");
}
}
class Dog : Animal
{
public override void Run()
{
// base.Run(); // К сожалению, так тоже ОК
Console.WriteLine("Dog.Run()");
}
}
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
dog.Run();
}
}
Re[3]: сообщение компилятора на отсутствие вызова метода пре
Hello, "Gary" > VD>Нет никаких проблем в твоем примере. Что-ты ты накасячил где-то еще. > Вот именно в том и проблема, что нет проблем! > Я хочу, чтобы в случие отсутствия вызова базовой функции компилятор > говорил об этом >
Компилятор не может отслеживать все варианты логических ошибок. Если очень
надо, то для этого есть FxCop
Posted via RSDN NNTP Server 1.9
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: сообщение компилятора на отсутствие вызова метода предка
Здравствуйте, Gary, Вы писали:
G>Можно ли в Visual Studio заставить компилятор выдавать сообщение о том, что переписанная виртуальная функция в наследованном классе не вызывает соответствующую функцию базового класса?
Такого варнинга нет. Если есть большое желание (или интерес), то можно в качестве post-build event-а прикрутить fxcop, а для него написать свой rule, который будет проверять есть ли в перегруженном методе обращение к методу из базового класса.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[4]: сообщение компилятора на отсутствие вызова метода пре
Здравствуйте, Gary, Вы писали:
G>Можно ли в Visual Studio заставить компилятор выдавать сообщение о том, что переписанная виртуальная функция в наследованном классе не вызывает соответствующую функцию базового класса? G>В свойствах проекта выставлен warning level 4, Visual Studio 2005
G>То есть, хотелось бы получить предупреждение в следующей ситуации:
Если тебе надо чтобы всегда выполнянлся код базового класса, то тебе надо спроектировать классы по другому.
Можно испльзовать pattern — Template Method:
public class Animal
{
public void Run()
{
// always do something
Console.WriteLine("Call method Animal.Run.");
// and do anything
RunImpl();
}
protected virtual void RunImpl()
{
// если нет базовой реализации то лучше класс Animal и этот метод сделать abstract
}
}
public class Dog : Animal
{
protected override void RunImpl()
{
Console.WriteLine("Call method Dog.RunImpl.");
}
}
<< RSDN@Home 1.1.4 stable rev. 510>>
Re[5]: сообщение компилятора на отсутствие вызова метода пре
Для нового кода понятно. Проблема со старым...
Имеется старый код. Исторически базовый класс был абстрактным, поэтому в наследуемых классах абстракные базовые функции не вызывались. Потом он перестал быть абстрактным... Потом появились пустые функции... Потом в НЕКОТОРЫХ появился код, и в НЕКОТОРЫХ наследуемых появился вызов предка... А уже потом пришли вилы в виде поиска дырок
Re[6]: сообщение компилятора на отсутствие вызова метода пре
Здравствуйте, Gary, Вы писали:
G>Вот именно в том и проблема, что нет проблем! G>Я хочу, чтобы в случие отсутствия вызова базовой функции компилятор говорил об этом
А с чего он возьмет что это ошибка? Может ты специально перекрыл обработчик чтобы изменить поведение?
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: сообщение компилятора на отсутствие вызова метода пре
Здравствуйте, Gary, Вы писали:
G>Можно ли в Visual Studio заставить компилятор выдавать сообщение о том, что переписанная виртуальная функция в наследованном классе не вызывает соответствующую функцию базового класса? G>В свойствах проекта выставлен warning level 4, Visual Studio 2005
А как разрулить ситуацию, если необходимо вызвать метод базового класса только в случае выполнения некоторого условия (например, часто именно за счёт этого механизма, фильтруется обработка оконных сообщений)?
В принципе, можно сочинить аттрибут (для FxCop или CodeAnalyzer) для метода\свойства и навешивать его в базовом классе для декларации обязательного\не обязательного\условного вызова предка в случае перегрузки
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Gary, Вы писали:
G>>Вот именно в том и проблема, что нет проблем! G>>Я хочу, чтобы в случие отсутствия вызова базовой функции компилятор говорил об этом
VD>А с чего он возьмет что это ошибка? Может ты специально перекрыл обработчик чтобы изменить поведение?
А я и не говорил, что это ошибка, мне достаточен warning. Я хочу найти все проблематичные места, то есть те, где нет вызова, и проанализировать их вручную.
Re[7]: сообщение компилятора на отсутствие вызова метода пре
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Lloyd, Вы писали:
L>>Можешь не спешить. В дефолтовой поставке нет такого рула.
VD>Можно сделать свой. Только вот на какой логике он будет основываться?
На отсутствии вызова базовой функции из наследованной. Никто не говорит, что это ошибка, но хочется заострить внимание на факте.
Re[2]: сообщение компилятора на отсутствие вызова метода пре
_FR>А как разрулить ситуацию, если необходимо вызвать метод базового класса только в случае выполнения некоторого условия (например, часто именно за счёт этого механизма, фильтруется обработка оконных сообщений)?
_FR>В принципе, можно сочинить аттрибут (для FxCop или CodeAnalyzer) для метода\свойства и навешивать его в базовом классе для декларации обязательного\не обязательного\условного вызова предка в случае перегрузки
Не надо усложнять. Достаточно информативного сообщения, что наследуемый класс не обращается к переписанному метода предка. Что с этим делать, и правильно ли это или нет, я разберусь сам. Автоматизация не нужна, нужен рутинный поиск
Re[3]: сообщение компилятора на отсутствие вызова метода пре
Здравствуйте, Друг Гарри, Вы писали:
_FR>>А как разрулить ситуацию, если необходимо вызвать метод базового класса только в случае выполнения некоторого условия (например, часто именно за счёт этого механизма, фильтруется обработка оконных сообщений)?
_FR>>В принципе, можно сочинить аттрибут (для FxCop или CodeAnalyzer) для метода\свойства и навешивать его в базовом классе для декларации обязательного\не обязательного\условного вызова предка в случае перегрузки
ДГ>Не надо усложнять. Достаточно информативного сообщения, что наследуемый класс не обращается к переписанному метода предка. Что с этим делать, и правильно ли это или нет, я разберусь сам. Автоматизация не нужна, нужен рутинный поиск
В большом гуишном приложении таких сообщений может быть порядка сотни Не проще ли сделать поиск по слову override?
_FR>В большом гуишном приложении таких сообщений может быть порядка сотни Не проще ли сделать поиск по слову override?
У меня библиотека классов с уровнем наследования 4 максимум (пока...) Количество кода приближается к 500,000. Если утилита найдет мне 100 вызовов переписанных функций без обращения к базовой, я буду прыгать от счастья и проверю этот код за пару дней.
Повторюсь:
Для нового кода понятно. Проблема со старым...
Имеется старый код. Исторически базовый класс был абстрактным, поэтому в наследуемых классах абстракные базовые функции не вызывались. Потом он перестал быть абстрактным... Потом появились пустые функции... Потом в НЕКОТОРЫХ появился код, и в НЕКОТОРЫХ наследуемых появился вызов предка... А уже потом пришли вилы в виде поиска дырок
Re[5]: сообщение компилятора на отсутствие вызова метода пре
Здравствуйте, Друг Гарри, Вы писали:
ДГ>У меня библиотека классов с уровнем наследования 4 максимум (пока...) Количество кода приближается к 500,000. Если утилита найдет мне 100 вызовов переписанных функций без обращения к базовой, я буду прыгать от счастья и проверю этот код за пару дней.
for /F "usebackq delims==" %i IN (`grep -lr override *`) DO @grep -L base %i
Выведет список файлов, в которых есть override, но нет base.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[8]: сообщение компилятора на отсутствие вызова метода пре
Здравствуйте, Друг Гарри, Вы писали:
VD>>Можно сделать свой. Только вот на какой логике он будет основываться? ДГ>На отсутствии вызова базовой функции из наследованной. Никто не говорит, что это ошибка, но хочется заострить внимание на факте.
и будешь смотреть на тонны ворнингов в местах где это поведение задумано изначально?
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: сообщение компилятора на отсутствие вызова метода пре
Здравствуйте, Друг Гарри, Вы писали:
ДГ>А я и не говорил, что это ошибка, мне достаточен warning. Я хочу найти все проблематичные места, то есть те, где нет вызова, и проанализировать их вручную.
А не проще ли скачать R# и сделать один запрос?
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: сообщение компилятора на отсутствие вызова метода пре
Здравствуйте, Друг Гарри, Вы писали:
ДГ>Здравствуйте, VladD2, Вы писали:
VD>>А не проще ли скачать R# и сделать один запрос? ДГ>А поподробнее можно, если не затруднит? Или ссылочку на фичу?
Подробнее здесь.
В R# есть визуальная утилита позволяющая писать и тестировать XPath-запросы. После небольшой тренировки написать запрос вынимающий все перегруженные методы не содержащие вызова базового метода не составит труда.
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: сообщение компилятора на отсутствие вызова метода пре
VD>Подробнее здесь. VD>В R# есть визуальная утилита позволяющая писать и тестировать XPath-запросы. После небольшой тренировки написать запрос вынимающий все перегруженные методы не содержащие вызова базового метода не составит труда.
Спасибо. Для моей конкретной задачи, мне кажется, это перебор Хотя статью прочел с интересом — идея хороша, но в практической жизни применима ну в ооооооочень больших проектах.
Re[9]: сообщение компилятора на отсутствие вызова метода пре
Здравствуйте, Друг Гарри, Вы писали:
ДГ>Спасибо. Для моей конкретной задачи, мне кажется, это перебор Хотя статью прочел с интересом — идея хороша, но в практической жизни применима ну в ооооооочень больших проектах.
Это просто боязнь нового. На самом деле очень многие вопросы связанные с анализом кода решаются на раз. Все же одно дело написать импиративный код нехилого размера для FxCop, а другое дело запрос (а-ля SQL-ый) в визуальной утилите.
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: сообщение компилятора на отсутствие вызова метода пре
Здравствуйте, Lloyd, Вы писали:
L>Такого варнинга нет. Если есть большое желание (или интерес), то можно в качестве post-build event-а прикрутить fxcop
В VS 2005 он встроенный.
... << RSDN@Home 1.2.0 alpha rev. 615 on Windows XP 5.1.2600.131072>>