Interface: Setter without a Getter

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我最近遇到了一个接口,它只定义了这样的一个setter:

public interface IAggregationView
{
   DataTable SetSiteData { set; }
}

我对此提出了质疑,并认为这是Microsoft为WebPart设计(针对SharePoint)所提倡的做法之一。实际上,这个示例是直接从它们的示例中复制的。

我认为这是一种糟糕的模式。

我想知道是否有人能解释只有一个setter的好处,为什么微软会在这种情况下建议它,它真的是一个很好的模式来遵循吗?

提问于
用户回答回答于

有两种情况我可以看到这可能是合理的:

  1. 它不是可能获得的值,例如密码; 不过,我会void SetPassword(string)用一种方法取代它
  2. 它所设计的API 并没有要求永远读取该值,并且它纯粹被限制为暴露最低要求的API

重申我的第一点,如果消费API本质上是一种为属性赋值的自动映射器,则Set...可能并不理想; 在这种情况下,属性确实会更可取。

用户回答回答于

接口属性getset接口属性的作用与类中的稍有不同。

public interface IAggregationView
{
   DataTable SetSiteData { set; }
}

class AggregationViewImp : IAggregationView
{
   public DataTable SetSiteData { get; set; }  // perfectly OK
}

该接口指定该属性应该至少有一个公共setter。

所以如果接口契约只需要写入,get可以保持打开状态。无需要求公共获取者。

因此,你无法在接口中真正指定只读属性。只有'至少读取权限'。

interface IFoo
{
    int Id { get;  }
}

class Foo : IFoo
{
    public int Id { get; set; }  // protected/private set is OK too
}

扫码关注云+社区