Вопрос про создание интерфейсов и их реализацию
Не могу понять как выбирается случай для использования следующих интерфейсов. Допустим нужно реализовать отправку файла. Стоит создавать интерфейс по типу:
interface ICustomFileSender
{
Task SendByEmailAsync(CustomFile file);
Task SendByHttpAsync(CustomFile file);
}
и дальше его реализовывать, либо создать интерфейс по типу:
interface ICustomFileSender
{
Task SendAsync(CustomFile file);
}
class CustomEmailFileSender : ICustomFileSender
{
//Реализация
}
От чего следует отталкиваться одного из перечисленных интерфейсов?
Ответы (1 шт):
В первом случае, чтобы добавить канал доставки, вам придется изменять интерфейс, и код, который с ним взаимодействует.
interface ICustomFileSender
{
Task SendByEmailAsync(CustomFile file);
Task SendByHttpAsync(CustomFile file);
Task SendByFtpAsync(CustomFile file);
Task SendBySmsAsync(CustomFile file);
Task SendByTelegramAsync(CustomFile file);
Task SendByViberAsync(CustomFile file);
}
Следовательно, второй вариант выглядит правильно, только я бы немного переименовал метод, чтобы название отражало его суть.
interface ICustomFileSender
{
Task SendFileAsync(CustomFile file);
}
Интерфейс - это абстракция, которая по своей сути позволяет вам без ошибок реализовать наследующий класс (код не скомпилируется, если класс не полностью реализует интерфейс), плюс позволяет вам добавлять разные реализации, не меняя остальной код. Создаете еще один реализующий класс, закидываете экземпляр класса в коллекцию, и готово.
List<ICustomFileSender> allSenders = GetAllSenders();
CustomFile file = OpenCustomFile();
List<Task> tasks = new List<Task>();
foreach (ICustomFileSender sender in allSenders)
{
tasks.Add(sender.SendFileAsync(file));
}
await Task.WhenAll(tasks);