属性获取者/二传手不是接口合约的一部分

本文关键字:接口 一部分 获取 二传手 属性 | 更新日期: 2023-09-27 18:36:30

为什么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更强大。