2010-04-17 148 views
4

如果我們將屬性定義爲public屬性,並且在此屬性中我們有一個protected獲取器。這是什麼意思?如果財產是公共的,爲此定義一個受保護的吸氣者是什麼意思? 請參見下面的代碼:這是什麼意思? [c#]

public ISessionFactory SessionFactory 
    { 
     protected get { return sessionFactory; } 
     set { sessionFactory = value; } 
    } 
+5

這是可以允許的,儘管擁有一個吸氣器的能見度低於吸氣器也是非常奇怪和意外的。 – 2010-04-17 13:02:43

+0

我不明白爲什麼它會是奇怪或意外的。如果公共吸氣劑沒有增加任何價值,爲什麼它應該是?然而,課堂上可能需要外部輸入,在這種情況下,擁有公開製片人是非常合理的。將其視爲方法參數。你可以設置參數,但是除非方法實際返回它們,否則你不能取回它們。當然得到它們是沒有意義的,如果你是來電者,你已經可以訪問它們。如果你不是主叫方,那麼你可能沒有訪問權限的一個很好的理由。封裝是很好的OOP。 – 2010-04-17 13:48:36

+0

@macke,在這種情況下,我會強烈選擇Set或Initialize方法,因爲屬性的語義意味着可觀察性。如果我可以設置Instance.X =值,我希望能夠立即斷言(Instance.X ==值)(如果沒有執行該集合的異常)。 – 2010-04-17 14:15:14

回答

2

在C#中,您可以擁有getters and setters的訪問級別(請參閱access modifiers)與整體屬性不同。這是最常見的模式

public class FooObject 
{ 
    public String Foo 
    { 
     get; 
     private set; 
    } 
} 

允許對象實例化FooObject檢索美孚的價值,但沒有設置它的值。 setter上的私有修飾符表示只有FooObject本身具有此能力(不包括使用反射)。

有兩個優點是:

  1. 通過增加自動屬性(沒有變量需要分配get和set值),這使得物業變量的私人環境(它爲您創建在編譯時),無需顯式創建變量即可完成。如果沒有這個,你就不能使用自動屬性,除非你總是希望get和set函數全部公開,所有私有等。

  2. 它允許抽象級別,以便所有方法無論是公共的,私有的,或以其他方式通過該財產而不直接訪問私有變量。有關更多信息,請參見question

在您的實例中,其他對象可能會設置會話工廠的值,但只有從它繼承的類可以檢索它。大多數情況下,如果一個對象可以設置該值,它也可以檢索它,但有些情況下不允許它。這是允許的,因爲set事件不允許比爲整個屬性定義的更大的訪問量。

我能想到的最好的例子就是如果在set事件中,set對象被修改了。例如,如果set事件設置了一個連接對象,並且在設置事件上添加了連接字符串,並且打開了與數據庫的連接(在我的例子中,我可能會重構代碼而不以這種方式行事,但是可能會出現類似的情況)。

11

這意味着,吸氣劑只能由子類調用。 getter之前的'protected'可以覆蓋屬性的getter部分的'public'。

0

受保護的GET意味着這個屬性的getter只能從一個類繼承這個類的訪問。該集被假定爲公開的,所以該屬性可以被公開設置。