【问题标题】:Can an Interface contain a variable? [duplicate]接口可以包含变量吗? [复制]
【发布时间】:2011-08-07 14:17:21
【问题描述】:

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

提前致谢。

【问题讨论】:

  • @Gishu - (+1) 感谢您指出正确的线程。 -------------------------------------------------- ---- @Sandeep - 简单来说,接口只能包含方法声明。属性、事件或索引器是方法的变体。属性中的 getter 和 setter 只是方法的变体。有关详细信息,请参阅“通过 C# 进行 CLR”或“Essential .net 第 1 卷”。

标签: c# .net oop interface properties


【解决方案1】:

没有。接口不能包含字段。

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

【讨论】:

  • 感谢您的回答。尽管该属性是字段的 get set 方法的语法糖,但在接口中使用时,只存在不包括字段的 get set 方法。如果我理解错了,请纠正我。
  • @Sandeep - 字段没有获取/设置方法。字段只是与类关联的存储项。属性是在客户端代码中像字段一样访问的成员,但允许执行代码以确定要返回的值,或者在设置值时进行一些处理。一个属性可能与一个或多个字段相关联,但并非必须如此。自动属性 ​​(int Property { get; set; }) 是仅获取和设置私有支持字段的属性的语法糖。
  • @Sandeep - 接口仅指定客户端代码应该能够对实现该接口的类的实例执行什么操作。它没有指定类如何处理交互的任何内容。因此它只包括属性、方法、事件和索引器的声明,没有实现。接口中的 Property 声明看起来与类中的自动属性相同,但没有支持字段,除非类实现了接口,否则它实际上不会做任何事情。
【解决方案2】:

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

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

主类:

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

【讨论】:

    【解决方案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,仅此而已。实现类的任务是执行实现并定义属性。

    【讨论】:

      【解决方案4】:

      不,不是那个意思。接口实际上也不包含该属性。

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

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 我认为您会感到困惑,因为“自动支持”属性的语法与接口属性的语法相同。然而,在一个类中,编译器会为您插入支持变量; IE。自动支持的属性只是语法糖。
        猜你喜欢
        • 2018-05-05
        • 1970-01-01
        • 1970-01-01
        • 2020-10-26
        • 1970-01-01
        • 2023-04-11
        • 2011-01-10
        • 1970-01-01
        相关资源
        最近更新 更多