为什么getter / setter不是接口契约的一部分?例如:
public interface IFoo
{
int Id { get; }
}
class Foo : IFoo
{
public int Id { get; set; }
}
为什么即使接口声明不同,也允许在这里设置setter? 我在这里遇到的问题是不变性。实现我的界面的客户端将被允许创建我想要阻止的可变类型。我是否被迫退回使用方法和只读字段?
答案 0 :(得分:3)
要实现接口,您必须至少提供 它包含的方法 您可以提供更多,(例如,实现另一个接口)。
您可以将getter / setter对视为方法set_Id(int i)
和get_Id()
实际上,这就是它们在CLI的较低层建模的方式。
所以set_Id(int i)
只是实施者提供的另一种方法,没有任何东西
你可以阻止他这样做。
答案 1 :(得分:3)
接口提供合同。它说任何实现我(接口)的人至少应该实现他们提供的所有规范。
它不限制任何东西,除了接口契约指定之外,你可以实现你希望提供的任何额外成员,但不能少。
此外,作为一种语言的c#不支持不可变性,因此您无法阻止用户实现可变类型。
我是否被迫退回使用方法和只读字段?
我不确定你的问题是什么,因为你说实现我的界面的客户端将被允许创建可变类型。谁是客户?另一个程序员?
无论如何,readonly
不是非常只读。请记住,您始终可以使用反射枪修改它们,它比readonly
更强大。