Можно ли в 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 вызовов переписанных функций без обращения к базовой, я буду прыгать от счастья и проверю этот код за пару дней.
Повторюсь:
Для нового кода понятно. Проблема со старым...
Имеется старый код. Исторически базовый класс был абстрактным, поэтому в наследуемых классах абстракные базовые функции не вызывались. Потом он перестал быть абстрактным... Потом появились пустые функции... Потом в НЕКОТОРЫХ появился код, и в НЕКОТОРЫХ наследуемых появился вызов предка... А уже потом пришли вилы в виде поиска дырок