属性Getter / Setter不是接口合同的一部分

时间:2015-01-07 12:55:07

标签: c# properties immutability

为什么getter / setter不是接口契约的一部分?例如:

public interface IFoo
{
    int Id { get; } 
}

class Foo : IFoo
{
    public int Id { get; set; }
}

为什么即使接口声明不同,也允许在这里设置setter? 我在这里遇到的问题是不变性。实现我的界面的客户端将被允许创建我想要阻止的可变类型。我是否被迫退回使用方法和只读字段?

2 个答案:

答案 0 :(得分:3)

要实现接口,您必须至少提供 它包含的方法 您可以提供更多,(例如,实现另一个接口)。

您可以将getter / setter对视为方法set_Id(int i)get_Id() 实际上,这就是它们在CLI的较低层建模的方式。

所以set_Id(int i)只是实施者提供的另一种方法,没有任何东西 你可以阻止他这样做。

答案 1 :(得分:3)

接口提供合同。它说任何实现我(接口)的人至少应该实现他们提供的所有规范。

它不限制任何东西,除了接口契约指定之外,你可以实现你希望提供的任何额外成员,但不能少。

此外,作为一种语言的c#不支持不可变性,因此您无法阻止用户实现可变类型。

  

我是否被迫退回使用方法和只读字段?

我不确定你的问题是什么,因为你说实现我的界面的客户端将被允许创建可变类型。谁是客户?另一个程序员?

无论如何,readonly不是非常只读。请记住,您始终可以使用反射枪修改​​它们,它比readonly更强大。