【问题标题】:Why set a property value of an interface?为什么要设置接口的属性值?
【发布时间】:2021-02-22 23:43:45
【问题描述】:

在自定义 HttpClient 的以下代码中,我发现一个方法接受一个接口并将其写入,就好像它是一个具有属性的对象:

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

我对@9​​87654322@ 有点困惑。为什么要设置接口的属性?这不是你要对所述接口的对象实现做的事情吗?

【问题讨论】:

  • cacheContext 是ICacheContext 的实现,它是一个对象,而不仅仅是一个接口
  • Isn't that something you'd do to the object implementation of said interface? 那是字面意思代码在做什么。

标签: c# .net caching interface implementation


【解决方案1】:

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

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

此外,从技术上讲,代码没有设置接口的属性。它使用接口的掩码设置实现的属性。

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

【讨论】:

    【解决方案2】:

    可能它接收到一个实现 ICacheContext 关于 OOP 多态性的实例

    例如

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 2023-03-12
      • 2019-05-23
      • 2011-03-23
      相关资源
      最近更新 更多