接口应该定义属性吗?

时间:2010-03-21 23:29:54

标签: c# interface

MSDN定义的接口“仅包含方法,委托或事件的签名。”但是,由于属性只是get和set方法的语法糖,因此它们也允许在接口中使用。我的问题是 - 在接口中定义属性是否恰当或者我们是否应该坚持MSDN描述的场景?

4 个答案:

答案 0 :(得分:32)

我认为属性在接口中是完全可以接受的。

正如你所说,他们真的是一个获取,设置或获取和设置方法。框架中的许多接口定义属性,例如IAsyncResultIWebProxy

答案 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#本质上只允许使用更简洁的语法。