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