由MSDN定义的接口“仅包含方法,委托或事件的签名。”但是,由于属性只是get和set方法的语法糖,因此它们也允许在接口中使用。我的问题是 - 在接口中定义属性是否恰当或者我们是否应该坚持MSDN描述的场景?
答案 0 :(得分:32)
我认为属性在接口中是完全可以接受的。
正如你所说,他们真的是一个获取,设置或获取和设置方法。框架中的许多接口定义属性,例如IAsyncResult和IWebProxy。
答案 1 :(得分:14)
您链接的文章还说明:
接口可以是a的成员 命名空间或类,可以包含 以下成员的签名:
- 方法
- 的属性强>
- 索引器
- 活动
答案 2 :(得分:3)
是的,接口应该在真正需要时定义属性。请假设。有一个IUser接口定义了一个属性“Name”,然后你可以使用它而不用担心对象是否没有实现该属性。
public void main()
{
IUser u = User.GetUser("id");
string name = u.Name;
}
答案 3 :(得分:1)
在接口中定义属性是完全合法的。关于为什么可以使用属性但不能使用字段的相当详尽的解释,请参见此处的答案:Why Can's C Sharp Interfaces Contain Fields
您将要记住,接口中定义的任何属性将始终是公共的。也就是说,如果您在接口中定义了一个getter和setter,那么getter和setter都必须是公共的。您可以根据需要在接口中仅定义getter,然后在实现类中定义私有setter。绝对是一个需要谨慎工作的地方。
类似地,Java不允许在其接口中使用实例变量。但是,它确实允许声明变量,并且这些变量将被视为静态和只读。如果您在实现类中需要使用getMyVariable()和setMyVariable()方法,则Java中的约定是编写它们。 C#本质上只允许使用更简洁的语法。