2013-03-21 25 views
-1

在接口中不可能有實例變量或任何實現。但我們可以有屬性。不屬性只是獲取和設置方法?獲取和設置方法不僅僅是獲取和設置變量的方式?這不是作弊嗎?據我記得C++和Java不允許這樣做。似乎有些東西對於C#中接口的實現並不那麼「純粹」。接口中的屬性不是數據嗎?

+2

屬性總是隻是調用get和/或set方法的語法糖。 – cdhowie 2013-03-21 18:25:09

+3

正如你所說,屬性只是方法。他們可能會或可能不會寫入潛在領域的事實不是一個因素。實際上,屬性可能根本不會執行任何操作,也不會寫入任何字段或從任何字段中檢索數據。編輯:也許混淆來自自動屬性。自動屬性的語法與接口屬性非常相似。然而,自動屬性只是語法糖來寫入一個潛在的領域;接口屬性並非如此。 – 2013-03-21 18:25:23

+0

接口中的屬性是抽象函數。而已。 – antonijn 2013-03-21 18:25:29

回答

7

屬性只是獲取和設置方法嗎?

是的,他們是。他們是方法。行爲,而不是有關如何實施該行爲的實施細節。這就是屬性和字段之間的區別 - 這就是爲什麼屬性在接口中是允許的。

而獲取和設置方法不只是獲取和設置變量的方式?

不,他們是方法。不管你想要什麼,他們都可以實現。他們可能通過簡單的字段實現 - 但它們可能不是。 (您認爲DateTime.Now讀取哪個字段?)

據我記得C++和Java不允許這樣做。

Java的肯定讓你把getter和setter方法的接口上...

+1

...而C++甚至沒有接口! – cdhowie 2013-03-21 18:29:04

2

屬性只是兩種方法,包作爲一個單一的名字。通過在界面中定義屬性(例如,Name),您實際上正在定義兩個單獨的方法(get_Nameset_Name)。不過,您可以定義方法(getset訪問器)。通常您會返回或設置字段的值,但這不是強制性的。

通過定義兩個單獨的方法(例如,getNamesetName),可以在Java或C++中執行相同的操作。

接口中的屬性可能看起來像C# auto-implemented properties,但它們確實不同。當你像這樣定義一個接口:自動

class Person 
{ 
    public string Name { get; set; } 
} 

編譯:

interface IPerson 
{ 
    string Name { get; set; } 
} 

您強制接口實施者創建一個讀/寫命名爲Name屬性,但是當你做同樣的一類創建一個用於保存字符串值的後備字段,並定義從該字符串字段讀取/寫入的兩種方法。

4

你在接口中看到的不是一個具體的屬性,它只是一個定義什麼是屬性簽名(屬性名稱,返回類型訪問修飾符,以及它是否具有get和set,例如)必須看起來像在實現此接口的任何類。

在一個接口,它是不是一個get和set方法,它不是一個實際的方法的話,那是什麼樣的get和set方法必須看起來像在任何類,僅僅實現了定義這個界面。

這聽起來很微妙,但事實並非如此。這是一個巨大的區別。

我知道一個抽象類中,我們提到的東西,如

public abstract void Required(int a, string b); 

抽象方法。這是我猜想的語義,這裏沒有任何內容會改變什麼是常見的接受用法,但它們(就像接口定義一樣),實際上只是一個規範和一個要求從這個派生類中的方法的簽名抽象類。

2

屬性只是getter和setter,是的(你可以通過使用monodisildasm一個可執行文件證實了這一點,並看到他們只是方法。

所以在接口性能都只是抽象的函數。一點也沒有無論你是否有支持領域,支持領域(屬於該屬性的變量)基本上與屬性本身無關。

所以不,屬性不需要內存,而不是數據,其後臺字段可能是,但屬性本身不是數據。