这是否违反了c#中接口的设计原则?

这是否违反了c#中接口的设计原则?,c#,interface,C#,Interface,当我在谷歌上搜索有关界面的相关主题时,我在MSDN网站上找到了以下内容: 例如,接口可以声明具有get访问器的属性。实现接口的类可以使用get和set访问器声明相同的属性。 现在我有一个疑问。当我们特别提到属性应该是只读的(接口中只有“get”访问器)时,为什么还允许它实现“set”访问器?您不能从接口引用访问set属性,因此在向公众展示接口时,它是否实现并不重要 当然,有时有必要在类端实现一个set访问器,例如,当使用一个允许访问同一程序集中的类的类时 现在我有一个疑问。当我们特别提到属性应

当我在谷歌上搜索有关界面的相关主题时,我在MSDN网站上找到了以下内容:

例如,接口可以声明具有get访问器的属性。实现接口的类可以使用get和set访问器声明相同的属性。


现在我有一个疑问。当我们特别提到属性应该是只读的(接口中只有“get”访问器)时,为什么还允许它实现“set”访问器?

您不能从接口引用访问
set
属性,因此在向公众展示接口时,它是否实现并不重要

当然,有时有必要在类端实现一个set访问器,例如,当使用一个允许访问同一程序集中的类的类时

现在我有一个疑问。当我们特别提到属性应该是只读的(接口中只有'get'访问器)时,为什么还允许它实现'set'访问器

有一点不同——当您使用接口时,您并不是“指定属性应为只读”,而是指定合同定义了该特定名称和类型的“可读属性”。基本上,接口定义了合同的最低要求,而不是绝对要求


如果将对象强制转换到特定接口,则属性设置器将不可用。它实际上与在对象上具有接口不可用的额外属性或方法没有什么不同。

使用接口的代码不知道有一个集合,因此不能使用它。

将接口视为一个契约。实施者承诺至少遵守该合同中定义的行为,但不限于此。接口允许组件在不紧密耦合的情况下进行交互。因此,一个实现可以同时允许
get
set
,但至少必须尊重
get

类满足接口的要求,其他任何内容都是类本身的实现细节。如果您通过接口引用对象,那么只会看到get。因此,不,它并没有真正破坏它,它是按预期的那样实现的。

接口是需要实现的最低要求集,但您可以实现更多。在这种情况下,读写属性不仅仅是只读属性


除了扩展到契约的要求之外,您还可以添加任何其他方法和/或属性,并在同一类中实现其他接口。

不过,该接口只是消费者应该如何使用该对象的声明。它没有对实现做出任何规范。这里没有矛盾

public interface IFoo {
    string Name { get; }
}

class FooImplementation : IFoo {
    public string Name { get; set; }
}

public class FooWorker {
    public void WorkOnFoo(IFoo foo) {
        if (null == foo) throw new ArgumentNullException("foo");
        Console.WriteLine(foo.Name);
    }
}

public class Program {
    public void Main() {
        IFoo foo = new FooImplementation { Name = "Foo" };
        new FooWorker().WorkOnFoo(foo);
    }
}
FooWorker
而言,
foo
参数只有一个
get
访问器用于
Name
属性


记住,
Name
属性仍然可以通过反射或强制转换设置在
foo
上,这一点可能很重要。

Felix所说的是正确的

更详细地说,接口定义了在任何定义为实现所述接口的对象上必须存在的最小功能集。这在接口的所有实现中提供了一组“通用”功能,因此您知道,如果一个对象实现了接口,您可以对其调用X、Y和Z。例如,仅仅因为某些东西是可识别的,并不意味着这就是对象所能做的。事实上,如果接口还定义了最大数量的功能,那么这将使接口变得毫无意义。这就是您所关心的,当您使用对象作为接口的实现时;如果您只需要一个IDisposable,那么您只需要调用Dispose(),而不管特定IDisposable实现可能有哪些其他成员


回到您的示例,定义属性的接口声明它必须具有公共get访问器。它没有,也不能说它不能有公共集访问器;这两种方式都不重要。集合访问器可以是公共的、内部的、受保护的、私有的或不存在的;接口的消费者所期望的,以及接口的实现者所需要的,是get访问器。

从三种类型的东西来考虑可能是有帮助的:抽象的
ReadableFoo
类(或
IReadableFoo
接口),以及具体的
ImmutableFoo
MutableFoo
类(或
IImmutableFoo
IChangeableFoo
接口)。接收类型为
ReadableFoo
的参数的人将能够读取该参数,但无法设置该参数,并且仅通过持久化引用无法可靠地持久化其中的数据。接收参数
ImmutableFoo
的人将能够通过持久化引用来可靠地持久化数据,但无法更改它。接收参数
MutableFoo
的人将能够更改数据,但不能通过持久化引用来可靠地持久化数据。

。接口不能用来拒绝访问属性,只能证明哪些属性是可访问的。很好的解释。谢谢里德·科佩。