Как мне обрабатывать конфликты в перегруженных методах - PullRequest
2 голосов
/ 11 февраля 2010

У меня такое ощущение, что этот вопрос - червячная банка, но я все равно собираюсь спросить ...:)

У меня есть метод:

private MembershipUser GetUserFromReader(SqlDataReader reader)

И я хочу перегрузить этот метод другим типом возврата:

private User GetUserFromReader(SqlDataReader reader)

Но компилятор жалуется, что оба метода имеют одинаковую подпись.

Итак, каков наилучший способ сделать это? Я бы предпочел не добавлять ненужные Параметр только для изменения сигнатуры метода.

Я играл с идеей сделать что-то вроде:

private User GetUserFromReader(T reader)

Но я еще не полностью изучил это. Кажется, мне нужно сделать куча изменений в том, как я использую свой объект для чтения.

Есть идеи? Какова лучшая практика, когда у вас есть два перегруженных методы одной подписи?

Спасибо за помощь ...

Ответы [ 5 ]

6 голосов
/ 11 февраля 2010

Зачем его перегружать? Почему бы просто не позволить методу сказать, что он делает, вот так:

private MembershipUser GetMembershipUserFromReader(SqlDataReader reader)
private User GetUserFromReader(SqlDataReader reader)
5 голосов
/ 11 февраля 2010

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

private T GetUserFromReader<T>(SqlDataReader reader)

Но гораздо проще просто переименовать методы, как в ответе Лумана.

2 голосов
/ 11 февраля 2010

Ваши единственные реальные варианты:

  1. Изменить имя функции
  2. Изменить сигнатуру функции

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

Если одна из перегрузок объявлена ​​в родительском классе, то вы можете использовать ключевое слово new, чтобы «скрыть» метод более высокого уровня от вызывающих, но new (в объявлении члена) обычно считается злым. *

1 голос
/ 11 февраля 2010

Простой ответ заключается в том, что в отношении C # вы не можете. Перегрузка по типу возврата разрешена (я думаю ) MSIL, но не C #.

Единственный реальный выбор (т. Е. Исключая добавление «фиктивного» параметра) - это вызвать один метод GetMembershipUserFromReader, а другой - GetUserFromReader

1 голос
/ 11 февраля 2010

Вы не можете изменить тип возврата при перегрузке. Как компилятор должен сказать, какой из них вы хотите использовать?

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

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

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