Что я получу, установив значения по умолчанию в интерфейсе, если мне всегда придется устанавливать их снова в реализации? - PullRequest
0 голосов
/ 07 февраля 2020

Я создал следующий интерфейс.

public interface IMineralService
{
  Task<Mineral[]> GetMinerals(int page = 0, int size = Int32.MaxValue);
  Task<Mineral> GetMineral(int id);
}

Его реализация заключается в следующем.

public class MineralService : IMineralService
{
  public async Task<Mineral[]> GetMinerals(int page = 0, int size = Int32.MaxValue)
  {
    Mineral[] data = await Task.FromResult(Minerals);
    return data.Skip(page * size).Take(size).ToArray();
  }

  public async Task<Mineral> GetMineral(int id)
  {
    Mineral[] data = await GetMinerals();
    return data.SingleOrDefault(a => a.Id == id);
  }
}

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

public interface IMineralService
{
  Task<Mineral[]> GetMinerals(int page = 0, int size = Int32.MaxValue);
}

public class MineralService : IMineralService
{
  public async Task<Mineral[]> GetMinerals(int page, int size) { ... }
}

Он также работает с значениями по умолчанию, только объявленными в реализации.

public interface IMineralService
{
  Task<Mineral[]> GetMinerals(int page, int size);
}

public class MineralService : IMineralService
{
  public async Task<Mineral[]> GetMinerals(int page = 0, int size = Int32.MaxValue)
}

Однако, чтобы второй метод работал с await GetMinerals () , в реализации должны быть установлены значения по умолчанию. Так какой смысл когда-либо устанавливать значение по умолчанию в конструкторе, если оно должно быть переформулировано в реализации (если оно используется другим вызовом) или не нужно вообще (если нет другого вызова, использующего значения по умолчанию)?

1 Ответ

1 голос
/ 07 февраля 2020

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

Из-за этого необязательность этих дополнительных параметров отделена от фактической реализации подробности о методе.

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

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

  • Если вы придерживаетесь методологии, согласно которой ожидающие классы будут внедрять ваш интерфейс как службу, и никогда не будете знать о конкретном классе, поддерживающем его, то нет смысла устанавливать значение по умолчанию для вашей реализации. Сигнатуры методов класса.
  • Если ваш интерфейс и класс разделяют определенные ожидания, и вы ожидаете, что ваш класс будет использоваться напрямую в некоторых случаях и через интерфейс в других случаях, то будет хорошей идеей объявить одно и то же значение по умолчанию. значение в обоих случаях.
  • Если ожидается, что ваш интерфейс будет использоваться способами, в которых смысл по умолчанию имеет смысл, отличный от тех случаев использования, которые вы предполагаете для людей, вызывающих ваш класс напрямую, тогда вы можете захотеть использовать другое значение по умолчанию. значения для каждого.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...