C # Наследование лучшие практики - PullRequest
4 голосов
/ 14 декабря 2011

У меня есть нормальный класс BaseView с виртуальным методом DisplayView.Этот метод вызывает GetHeader и GetBody виртуальные методы для получения содержимого страницы.Затем я создал бы класс, который наследовал от BaseView, и переопределил бы методы, которые должны отображать контент иначе, чем это делает базовый класс.

Моя проблема в том, что, хотя это прекрасно работает, при выполнении анализа кода меня предупреждают не вызывать виртуальные функции напрямую.

Должен ли я создать еще один слой класса поверх базового класса, который переопределяет виртуальные функции и наследует только от него?

Каковы недостатки использования виртуальных методов напрямую?

РЕДАКТИРОВАТЬ: предупреждение:

CA2214: Microsoft.Usage: xxx содержит цепочку вызовов, которая приводит к вызову виртуального метода, определенного классом.Проверьте следующий стек вызовов на непредвиденные последствия

1 Ответ

4 голосов
/ 14 декабря 2011

Я думаю, проблема в том, что DisplayView является виртуальным и вызывает виртуальные методы. В большинстве случаев виртуальные методы вызываются конечными методами как средство изменения поведения, например, в шаблоне стратегии. Если последний метод вызывает виртуальный метод, компилятор знает, что виртуальный метод всегда будет вызываться во всех производных классах, и поэтому он действителен для существования виртуального метода.

Тот факт, что вы вызываете виртуальный из виртуального, означает, что ваш дизайн может быть поставлен под сомнение: если DisplayView является виртуальным, другая реализация может переопределить его. Текущая реализация вызывает виртуальный GetHeader, но производный класс не может. Поэтому он не может гарантировать, что GetHeader не является мертвым кодом.

Это, вероятно, то, на что FxCop обращает ваше внимание. Он хочет знать, что если вы определили виртуальный метод (в данном случае GetHeader) в базовом классе, его будут использовать все производные реализации.

Я бы сфокусировался на том, чтобы сделать DisplayView финальным, или оценил бы ваш дизайн в этом свете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...