如果我总是必须在实现中再次设置默认值,那么通过在界面中设置默认值有什么好处呢?

What do I gain by setting the default values in the interface if I always have to set them again in the implementation?

我创建了以下界面。

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);
  }
}

我不明白在构造函数和实现中声明参数默认值的目的或含义是什么。跳过默认值不会与实现接口冲突,所以下面的方法是可行的。 Id est - 没有将接口的默认设置强加到实现上。

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() 一起使用,必须在实现中设置默认值。那么,如果必须在实现中重新声明(如果它被另一个调用使用)或者根本不需要(如果没有其他调用使用默认值),那么在构造函数中设置默认值有什么意义呢?

设置默认值不会向设置了默认值的 class 添加任何代码来设置这些值。相反,它使得任何调用这些方法而不提供显式值的消费代码实际上都将被编译以传递指定的值。

因此,这些可选参数的可选性与方法的实际实现细节是分离的。

这意味着您实现的不同接口可以提供不同的默认值。或者接口和 class 具有不同的默认值。或者实现 class 甚至根本不指定默认值,但接口的使用者仍然能够在不提供显式值的情况下调用 class 的方法。

所以这类似于决定 class 是否应该显式或隐式实现接口方法:您需要考虑您希望如何使用 class 和接口。

  • 如果您遵循的方法是使用 classes 预期将您的界面作为服务注入,并且永远不知道支持它的具体 class,那么设置您实现 class 方法签名的默认值。
  • 如果您的界面和 class 都具有某些期望,并且您希望您的 class 在某些情况下直接使用,而在其他情况下通过界面使用,那么最好声明两者的默认值相同。
  • 如果您的界面预期使用不同的默认值而不是您设想的人们直接调用您的 class 的用例,那么您可能需要不同的默认值每个。