接口可以包含变量吗?

时间:2011-04-18 04:19:37

标签: c# .net oop interface properties

  

可能重复:
  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#中的接口可以包含一个变量以及该属性支持的变量将如何处理?

提前致谢。

5 个答案:

答案 0 :(得分:24)

没有。界面不能包含字段。

接口可以声明一个Property,但它不提供任何实现,因此没有后备字段。只有在类实现接口时才需要支持字段(或自动属性)。

答案 1 :(得分:22)

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

Methods

Properties

Indexers

Events

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

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

示例:

// 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);    
   }    
}

答案 2 :(得分:3)

可以在接口(未定义)上声明属性。但是接口属性的访问者没有正文。因此,访问者的目的表示该属性是读写,只读还是只写。

如果您在此处查看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,而已。它是实现类来执行实现和定义属性的任务。

答案 3 :(得分:2)

不,这并不意味着。该接口实际上包含属性。

请记住,接口必须由类实现才能使用它。接口仅定义契约,这意味着实现该接口的任何类都将具有该接口定义的所有成员。界面实际上没有这些成员;它更像是一个模板。 实现接口的类的实例是包含该属性的实例,因此是用于该属性的私有支持字段。

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

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

答案 4 :(得分:2)

不,界面只是“合同”。由实现类实现属性;它可能会也可能不会使用变量来支持它。