Отказ от ответственности
Пожалуйста, не голосуйте, чтобы закрыть это, потому что заголовок выглядит субъективно, и, если его уже спрашивали, пожалуйста, укажите мне на предыдущий вопрос в комментариях, и я удалю этот - я действительно посмотрел высоко и низко, пытаясь найти предыдущий вопрос по теме.
Фон
Учитывая, что у меня есть следующий интерфейс и конкретная реализация:
public interface IFoo
{
// Some stuff
}
public class Foo : IFoo
{
// Concrete implementations of stuff
}
И где-то у меня есть следующий метод:
public Foo GiveMeAFoo()
{
return new Foo();
}
Я всегда всегда возвращал Foo
, видя , так как он по сути IFoo
в любом случае , так что его можно использовать на другом конце как IFoo
:
IFoo foo = GiveMeAFoo();
Основное преимущество, которое я вижу, состоит в том, что если мне действительно нужно потреблять Foo
где-то в качестве конкретной реализации , я могу.
Актуальный вопрос
Недавно я натолкнулся на некоторые комментарии по другому вопросу, которые затрудняют это, предлагая тип возвращаемого значения IFoo
.
Я ошибаюсь или они? Кто-нибудь может дать мне причину, почему возврат конкретной реализации - плохая идея?
Я знаю, что имеет смысл требовать IFoo
при получении параметра для метода, потому что чем менее специфичен параметр, тем более полезен метод, но , безусловно, делать конкретный тип возвращаемого значения необоснованно ограничительный .
Редактировать
Использование IFoo и Foo могло быть слишком расплывчатым. Вот конкретный пример из .NET (в .NET массивы реализуют IEnumerable - то есть string[] : IEnumerable<string>
)
public string[] GetMeSomeStrings()
{
return new string[] { "first", "second", "third" };
}
Конечно, плохая идея вернуть IEnumerable здесь? Чтобы получить свойство длины, вам теперь нужно вызвать Enumerable.Count (). Я не уверен насчет того, сколько оптимизировано в фоновом режиме, но логика подсказывает, что теперь придется подсчитывать элементы, перечисляя их, что должно сказаться на производительности. Если я просто верну массив как массив, то это прямой поиск свойства.