为什么给接口设置一个属性值?

Why set a property value of an interface?

在自定义 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; 有点困惑。为什么要设置接口的属性?这不是您要对所述接口的对象实现做的事情吗?

可能它接收到一个实例,该实例在 OOP 的多态性方面实现了 ICacheContext

例如

ICacheContext cacheCtx = new CacheContextImpl()  // Class which implements ICacheContext

通过引用接口而不是具体的 class,您可以轻松更换接口的实现,而无需更改引用对象的每个方法。在代码示例中,如果 ICacheContext 的三个实现都需要该方法,则使用接口允许它们都使用相同的方法。否则,您需要为每个实现创建三个具有不同签名的 GetAsync 方法。

在方法签名中使用接口而不是基础 class 的另一个原因是强制执行良好的编码实践 - 如果该方法只需要基础 class 的 ICacheContext 属性,使用接口会阻止您使用其他 properties/methods 实现(也许 CacheContextImplementation.cs 还处理日志记录或配置或您不想在 'GetAsync' 方法中处理的东西),限制自己界面迫使您对 OOP 更加友好。

此外,从技术上讲,代码并未设置界面的 属性。它正在设置实现的属性,使用接口的掩码。

希望这对您有所帮助,并且有意义