2012-02-07 2 views
1

Я работаю на C# довольно долгое время, но иногда встречаюсь с этим многолетним вопросом с коллегами.C# кодирование для наследуемого набора классов - полезно ли использовать ключевые слова base.methodname и this.methodname??

Вопрос: В наборе унаследованных классов - при вызове метода мы должны использовать ключевые слова base.methodname и this.methodname '... независимо от того, является ли это переопределенным методом или нет?

Ответ: ДА - это хорошая практика - используйте это, потому что именно поэтому они созданы.

Подробное объяснение: Кроме того, код может претерпеть изменения в терминах логики, и, возможно, некоторые условия IF-ELSE, например, могут появиться позднее. Поэтому в то время разработчик должен быть вынужден пересмотреть каждую строку кода и убедиться, что он/она делает правильный выбор того, какой метод вызывается --- base.methodname() или this.methodname() ELSE. NET Framework вызовет DEFAULT (я думаю, его base.methodname()), и вся логика может пойти на бросок.

Что думают другие программисты на C#?

ответ

0

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

Что касается базы - на мой взгляд, вы должны прямо сказать «база». если вы хотите явно вызвать базовый метод, а не переопределенный метод в текущем классе. Довольно часто единственное место, которое вы должны увидеть даже в самом переопределенном методе.

Не база вызовов только потому, что это будет реализация в базовом классе, который будет вызываться. Это не предназначено для того, чтобы сказать: «Я знаю, что фактическая реализация находится в базовом классе», это означает способ сказать «конкретно» не вызов реализации в этом классе, вызов базы один". Использовать его каким-либо другим способом частично поражает точку наследования.

0

Если вы уверены, что всегда будете использовать метод в базовом классе, вы можете использовать base.MyMethod. Но имейте в виду:

Представьте, что у вас есть метод «GetPrice» в базовом классе, и вы начинаете использовать base.GetPrice во всем своем унаследованном классе (PromoClass). Через 3 месяца кто-то просит изменить способ расчета цены в промоакциях (PromoClass), вы (или новый разработчик) переопределите или внесите новый метод и протестируете его ... подождите, не работайте: |. Потому что вы всегда вызываете метод в базовом классе. Поэтому он все равно вызовет метод в базе, и вам нужно будет изменить все вызовы в классе.

Это, конечно, пример. Если это стандартно в вашей компании, каждый должен знать, что он должен изменить по всему классу вызов этого метода, если нет, будьте осторожны.

Я предпочитаю использовать «базу». использовать базовые методы, но я обычно игнорирую «это».

+0

Что? Почему голос? –

0

Я думаю, что он пахнет плохим дизайном класса, если вы каким-либо образом можете сомневаться в том, вызываете ли вы метод в классе или базовом классе.

Мне трудно найти хорошие примеры, которые бы оправдывали явное вызов переопределенных методов базового класса, ожидая, если они будут получены из унаследованных или сторонних классов.

Лично я почти никогда не использую виртуальные методы. Вы почти всегда можете сделать лучший дизайн с интерфейсами и абстрактными методами.

При использовании базовых вызовов это связано с тем, что вы хотите расширить функциональность базового метода, поэтому вы вызываете базовый метод в методе переопределения. Любое другое использование базы на мой взгляд ошибочно во всех отношениях. Кроме того, перед переопределением виртуального метода и вызывающей базы вам следует подумать, можно ли реализовать расширение в противном случае. Например, если ваш базовый метод называется абстрактным методом или интерфейсом, который вы могли бы реализовать или впрыснуть в производном классе.

Несколько раз, когда я использовал виртуальные методы, мы оставляем «пустые» методы в базовом классе общего назначения. Пустые методы (например, InitializeThread() в инкапсуляции потоков) позволяют мне необязательно расширять базовый класс, но я бы никогда не писал код в базовых методах и никогда не вызывал базу.

Звонящая база - это просто неправильно!

0

Я согласен с @Holstebroe и @Bruno Costa. Когда вы явно вызываете base.Method каждый раз, вы эффективно отсекаете потенциал полиморфизма, и это одна из основных причин использования наследования в первую очередь.