繁体   English   中英

如果我总是必须在实现中再次设置它们,那么在接口中设置默认值有什么好处?

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

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

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

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

因此,这类似于决定一个类是应该显式实现还是隐式实现接口方法:您需要考虑如何使用您的类和接口。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM