在以下自定义HttpClient的代码中,我发现一个方法take接受一个接口并将其写入,就好像它是一个具有属性的对象一样:
public async Task<T> GetAsync<T>(ICacheContext cacheContext = null) {
try {
T result = default(T);
// check if value is cached
if (cacheContext != null) {
result = await GetResultFromCache<T>(cacheContext);
if (result != null) {
cacheContext.IsDataFromCache = true;
return result;
}
}
我对cacheContext.IsDataFromCache = true;
有点困惑。为什么要设置接口的属性?这不是你会对上述接口的对象实现做的事情吗?
通过引用接口而不是具体类,您可以轻松地交换接口的实现,而不必更改引用对象的每个方法。在代码示例中,如果ICacheContext有三个实现都需要该方法,那么使用该接口可以让它们都使用相同的方法。否则,您将需要为每个实现创建三个具有不同签名的GetAsync方法。
在方法签名中使用Interface而不是基类的另一个原因是为了实施良好的编码实践——如果方法只需要基类的ICacheContext属性,使用该接口可以阻止您使用实现的其他属性/方法(可能CacheContextImplementation.cs还处理日志记录或配置,或者您不希望在"GetAsync"方法中处理的内容(,将自己限制在该接口中会迫使您更加OOP友好。
此外,从技术上讲,代码并没有设置接口的属性。它使用接口的掩码来设置实现的属性。
希望这能有所帮助,并且有意义
可能它接收到一个实现ICacheContext的实例,该实例涉及OOP 的多态性
例如
ICacheContext cacheCtx = new CacheContextImpl() // Class which implements ICacheContext