2011-04-18 68 views
26

可能重复:
Why can't C# interfaces contain fields?一个接口可以包含一个变量吗?

大家好,

Jon Skeet has answered to a question that Using a property is backed by a variable.

但在接口特性允许在C#。这是否意味着C#中的接口可以包含一个变量,并且该属性支持的变量将如何处理?

在此先感谢。

+0

@Gishu - (+1)感谢您指向正确的线程。 ------------------------------------------------ ------ @Sandeep - 简单来说,一个接口只能包含方法声明。属性,事件或索引器是方法的变体。属性中的Getter&setter只是方法的变体。请参阅“通过C#的CLR”或“基本.net卷1”了解更多详情。 – 2011-04-18 05:42:17

回答

19

号的接口不能包含的字段。

接口可以声明一个属性,但它不提供任何实现,所以没有支持字段。只有当一个类实现了一个需要后台字段(或自动属性)的接口时。

+0

感谢您的回答。虽然属性是一个字段的设置方法的语法糖,但在Interface中使用时,除了字段以外,只有get方法存在。请纠正我如果我理解错了。 – Sandeep 2011-04-18 13:00:35

+1

@Sandeep - 一个字段没有get/set方法。一个字段只是一个与类关联的存储项目。属性是一个成员,可以像客户端代码那样访问字段,但允许执行代码来确定要返回的值,或者在设置值时执行一些处理。一个属性可能与一个或多个字段相关联,但不一定是。一个自动属性('int Property {get; set;}')是一个刚刚获取并设置私有后台字段的属性的语法糖。 – 2011-04-18 17:29:48

+1

@Sandeep - 接口只指定客户端代码应该能够对实现该接口的类的实例进行处理。它没有详细说明类如何处理交互。因此它只包含属性,方法,事件和索引器的声明,没有实现。接口中的属性声明看起来与类中的自动属性相同,但没有后台字段,除非类实现接口,否则它实际上不会执行任何操作。 – 2011-04-18 17:35:43

18

接口可以是命名空间或类的一个成员,并且可以包含下列成员的签名:

Methods 

Properties 

Indexers 

Events 

属性可以在接口上被声明。该声明采用以下形式: 接口属性的访问者没有正文。

因此,访问器的目的是指示属性是读写型,只读型还是只写型。

例子:

// Interface Properties  
interface IEmployee 
{ 
    string Name 
    { 
     get; 
     set; 
    } 

    int Counter 
    { 
     get; 
    } 
} 

实现:

public class Employee: IEmployee 
{ 
    public static int numberOfEmployees; 

    private int counter; 

    private string name; 

    // Read-write instance property: 
    public string Name 
    { 
     get 
     { 
     return name; 
     } 
     set 
     { 
     name = value; 
     } 
    } 

    // Read-only instance property: 
    public int Counter 
    {  
     get  
     {  
     return counter; 
     }  
    } 

    // Constructor: 
    public Employee() 
    { 
     counter = ++counter + numberOfEmployees; 
    } 
} 

MainClass:

public class MainClass 
{ 
    public static void Main() 
    {  
     Console.Write("Enter number of employees: "); 

     string s = Console.ReadLine(); 

     Employee.numberOfEmployees = int.Parse(s); 

     Employee e1 = new Employee(); 

     Console.Write("Enter the name of the new employee: "); 

     e1.Name = Console.ReadLine(); 

     Console.WriteLine("The employee information:"); 

     Console.WriteLine("Employee number: {0}", e1.Counter); 

     Console.WriteLine("Employee name: {0}", e1.Name);  
    }  
} 
1

不,这并不意味着。界面实际上并没有包含的属性,要么。

请记住,接口必须是实施由一个类为了您的使用它。一个接口只定义了一个合同,这意味着任何实现该接口的类都将拥有该接口定义的所有成员。界面实际上并没有这些成员;它更像是一个模板。 实现的类的实例该接口是包含该属性并因此用于该属性的专用支持字段的接口。

接口只能定义签名以下成员:

  • 方法
  • 属性
  • 索引器
  • 活动
2

属性可以在接口(未在声明定义)。但是接口属性的存取器没有一个正文。因此,的访问器的目的是表示属性是否为读写,只读,或者只写。

如果您在此检查出MSDN Doc,那么您会看到,您在界面中看到未定义属性,而是由继承类完成实现。

interface IEmployee 
{ 
    string Name 
    { 
     get; 
     set; 
    } 

    int Counter 
    { 
     get; 
    } 
} 

public class Employee : IEmployee 
{ 
    public static int numberOfEmployees; 

    private string name; 
    public string Name // read-write instance property 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
     } 
    } 

    private int counter; 
    public int Counter // read-only instance property 
    { 
     get 
     { 
      return counter; 
     } 
    } 

    public Employee() // constructor 
    { 
     counter = ++counter + numberOfEmployees; 
    } 
} 

所以在接口IEmployee属性的语法看起来像自动实​​现的属性,但他们只是表示属性是否为read-writeread-only,或write-only,仅此而已。它的任务是实现类来执行和定义属性。

2

没有,界面只有“合同”。由实施类实施该财产;它可能会或可能不会使用变量来支持它。

+0

我认为你会感到困惑,因为“auto-backed”属性的语法与接口属性的语法相同。然而,在一个类中,编译器会为你插入备份变量;即。自动支持的属性只是语法糖。 – 2011-04-18 04:28:34

相关问题