如果我总是必须在实现中再次设置默认值,那么在界面中设置默认值会得到什么?



>我创建了以下界面。

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

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

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

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

因此,这类似于决定类是否应该显式实现接口方法,而不是隐式实现接口方法:您需要考虑期望如何使用类和接口。

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

最新更新