сообщение компилятора на отсутствие вызова метода предка
От: Gary Земля  
Дата: 19.09.05 12:03
Оценка: 1 (1)
Можно ли в 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: сообщение компилятора на отсутствие вызова метода предка
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.09.05 12:23
Оценка:
Здравствуйте, 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]: сообщение компилятора на отсутствие вызова метода пре
От: Gary Земля  
Дата: 19.09.05 12:36
Оценка:
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]: сообщение компилятора на отсутствие вызова метода пре
От: TK Лес кывт.рф
Дата: 19.09.05 12:55
Оценка: +1
Hello, "Gary"
> VD>Нет никаких проблем в твоем примере. Что-ты ты накасячил где-то еще.
> Вот именно в том и проблема, что нет проблем!
> Я хочу, чтобы в случие отсутствия вызова базовой функции компилятор
> говорил об этом
>

Компилятор не может отслеживать все варианты логических ошибок. Если очень
надо, то для этого есть FxCop
Posted via RSDN NNTP Server 1.9
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: сообщение компилятора на отсутствие вызова метода предка
От: Lloyd Россия  
Дата: 19.09.05 12:59
Оценка:
Здравствуйте, Gary, Вы писали:

G>Можно ли в Visual Studio заставить компилятор выдавать сообщение о том, что переписанная виртуальная функция в наследованном классе не вызывает соответствующую функцию базового класса?


Такого варнинга нет. Если есть большое желание (или интерес), то можно в качестве post-build event-а прикрутить fxcop, а для него написать свой rule, который будет проверять есть ли в перегруженном методе обращение к методу из базового класса.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[4]: сообщение компилятора на отсутствие вызова метода пре
От: Друг Гарри Земля  
Дата: 19.09.05 13:02
Оценка:
Здравствуйте, TK, Вы писали:

TK>Компилятор не может отслеживать все варианты логических ошибок. Если очень

TK>надо, то для этого есть FxCop

O! Иду грузить и изучать. Спасибо.
Re: сообщение компилятора на отсутствие вызова метода предка
От: V.Petrovski Беларусь  
Дата: 19.09.05 13:03
Оценка: +2
Здравствуйте, 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]: сообщение компилятора на отсутствие вызова метода пре
От: Lloyd Россия  
Дата: 19.09.05 13:04
Оценка:
Здравствуйте, Друг Гарри, Вы писали:

ДГ>O! Иду грузить и изучать. Спасибо.


Можешь не спешить. В дефолтовой поставке нет такого рула.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[2]: сообщение компилятора на отсутствие вызова метода пре
От: Друг Гарри Земля  
Дата: 19.09.05 13:24
Оценка:
Для нового кода понятно. Проблема со старым...
Имеется старый код. Исторически базовый класс был абстрактным, поэтому в наследуемых классах абстракные базовые функции не вызывались. Потом он перестал быть абстрактным... Потом появились пустые функции... Потом в НЕКОТОРЫХ появился код, и в НЕКОТОРЫХ наследуемых появился вызов предка... А уже потом пришли вилы в виде поиска дырок
Re[6]: сообщение компилятора на отсутствие вызова метода пре
От: Друг Гарри Земля  
Дата: 19.09.05 13:27
Оценка:
Оп-па...
Так что, сначала надо купить?
Между прочим, интересует 2005 студия.
Или можно торкнуться куда?
Купить то готов, но попробовать бы сначала...
Re[7]: сообщение компилятора на отсутствие вызова метода пре
От: Lloyd Россия  
Дата: 19.09.05 13:30
Оценка:
Здравствуйте, Друг Гарри, Вы писали:

ДГ>Купить то готов, но попробовать бы сначала...


Ниче покупать не надо. Поищи в инете или попробуй написать сам нужный тебе рул.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[3]: сообщение компилятора на отсутствие вызова метода пре
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.09.05 15:15
Оценка:
Здравствуйте, Gary, Вы писали:

G>Вот именно в том и проблема, что нет проблем!

G>Я хочу, чтобы в случие отсутствия вызова базовой функции компилятор говорил об этом

А с чего он возьмет что это ошибка? Может ты специально перекрыл обработчик чтобы изменить поведение?
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: сообщение компилятора на отсутствие вызова метода пре
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.09.05 15:15
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Можешь не спешить. В дефолтовой поставке нет такого рула.


Можно сделать свой. Только вот на какой логике он будет основываться?
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: сообщение компилятора на отсутствие вызова метода пре
От: Lloyd Россия  
Дата: 19.09.05 15:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Можно сделать свой. Только вот на какой логике он будет основываться?


Re: сообщение компилятора на отсутствие вызова метода предка
Автор: Lloyd
Дата: 19.09.05
... << RSDN@Home 1.1.4 stable rev. 510>>
Re: сообщение компилятора на отсутствие вызова метода предка
От: _FRED_ Черногория
Дата: 19.09.05 15:26
Оценка:
Здравствуйте, Gary, Вы писали:

G>Можно ли в Visual Studio заставить компилятор выдавать сообщение о том, что переписанная виртуальная функция в наследованном классе не вызывает соответствующую функцию базового класса?

G>В свойствах проекта выставлен warning level 4, Visual Studio 2005

А как разрулить ситуацию, если необходимо вызвать метод базового класса только в случае выполнения некоторого условия (например, часто именно за счёт этого механизма, фильтруется обработка оконных сообщений)?

В принципе, можно сочинить аттрибут (для FxCop или CodeAnalyzer) для метода\свойства и навешивать его в базовом классе для декларации обязательного\не обязательного\условного вызова предка в случае перегрузки

ЗЫ
<< RSDN@Home 1.2.0 alpha rev. 616 >> =07:26= [Windows 2003 — 5.2.3790.65536]
under «*none*»
Help will always be given at Hogwarts to those who ask for it.
Re[4]: сообщение компилятора на отсутствие вызова метода пре
От: Друг Гарри Земля  
Дата: 19.09.05 16:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Gary, Вы писали:


G>>Вот именно в том и проблема, что нет проблем!

G>>Я хочу, чтобы в случие отсутствия вызова базовой функции компилятор говорил об этом

VD>А с чего он возьмет что это ошибка? Может ты специально перекрыл обработчик чтобы изменить поведение?


А я и не говорил, что это ошибка, мне достаточен warning. Я хочу найти все проблематичные места, то есть те, где нет вызова, и проанализировать их вручную.
Re[7]: сообщение компилятора на отсутствие вызова метода пре
От: Друг Гарри Земля  
Дата: 19.09.05 16:15
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Lloyd, Вы писали:


L>>Можешь не спешить. В дефолтовой поставке нет такого рула.


VD>Можно сделать свой. Только вот на какой логике он будет основываться?

На отсутствии вызова базовой функции из наследованной. Никто не говорит, что это ошибка, но хочется заострить внимание на факте.
Re[2]: сообщение компилятора на отсутствие вызова метода пре
От: Друг Гарри Земля  
Дата: 19.09.05 16:19
Оценка:
Здравствуйте, _FRED_, Вы писали:


_FR>А как разрулить ситуацию, если необходимо вызвать метод базового класса только в случае выполнения некоторого условия (например, часто именно за счёт этого механизма, фильтруется обработка оконных сообщений)?


_FR>В принципе, можно сочинить аттрибут (для FxCop или CodeAnalyzer) для метода\свойства и навешивать его в базовом классе для декларации обязательного\не обязательного\условного вызова предка в случае перегрузки


Не надо усложнять. Достаточно информативного сообщения, что наследуемый класс не обращается к переписанному метода предка. Что с этим делать, и правильно ли это или нет, я разберусь сам. Автоматизация не нужна, нужен рутинный поиск
Re[3]: сообщение компилятора на отсутствие вызова метода пре
От: _FRED_ Черногория
Дата: 19.09.05 16:23
Оценка:
Здравствуйте, Друг Гарри, Вы писали:

_FR>>А как разрулить ситуацию, если необходимо вызвать метод базового класса только в случае выполнения некоторого условия (например, часто именно за счёт этого механизма, фильтруется обработка оконных сообщений)?


_FR>>В принципе, можно сочинить аттрибут (для FxCop или CodeAnalyzer) для метода\свойства и навешивать его в базовом классе для декларации обязательного\не обязательного\условного вызова предка в случае перегрузки


ДГ>Не надо усложнять. Достаточно информативного сообщения, что наследуемый класс не обращается к переписанному метода предка. Что с этим делать, и правильно ли это или нет, я разберусь сам. Автоматизация не нужна, нужен рутинный поиск


В большом гуишном приложении таких сообщений может быть порядка сотни Не проще ли сделать поиск по слову override?
<< RSDN@Home 1.2.0 alpha rev. 616 >> =08:22= [Windows 2003 — 5.2.3790.65536]
under «*none*»
Help will always be given at Hogwarts to those who ask for it.
Re[4]: сообщение компилятора на отсутствие вызова метода пре
От: Друг Гарри Земля  
Дата: 19.09.05 16:29
Оценка:
Здравствуйте, _FRED_, Вы писали:


_FR>В большом гуишном приложении таких сообщений может быть порядка сотни Не проще ли сделать поиск по слову override?


У меня библиотека классов с уровнем наследования 4 максимум (пока...) Количество кода приближается к 500,000. Если утилита найдет мне 100 вызовов переписанных функций без обращения к базовой, я буду прыгать от счастья и проверю этот код за пару дней.

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