2011-04-18 60 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

相關問題