2013-04-30 110 views
0

C#類數據成員(字段或屬性)可以是私有的,也可以是公有的或受保護的。C#類成員訪問

如果我想要私人領域的成員方法只使用,而不是暴露給外部世界?

我可以繼續使用私人領域,而不破壞封裝或任何正確的?

什麼我不理解的是兩個概念:我們可能需要暴露給外界VS中的數據的數據,我們可能不需要這麼做(在類的外圍)..

在談論建造一堂課時,這兩種數據是什麼?

在下面的示例中,專用字段「名稱」對於該類是私有的,但仍然可以由外部世界獲取/設置。這裏的抽象是'不是直接暴露在'你'在這裏 - 有'它,而是添加一個間接的訪問機制或更新?當我們談論公共領域vs公共財產時,我們在這裏討論的是封裝嗎?

class Employee2 
{ 
    private string name = "Harry Potter"; 
    private double salary = 100.0; 

    public string GetName() 
    { 
     return name; 
    } 

    public void SetName(string title, string fullName) 
    { 
     this.name = title + fullName;   
    } 

    public double Salary 
    { 
     get { return salary; } 
    } 
} 

class PrivateTest 
{ 
    static void Main() 
    { 
     Employee2 e = new Employee2(); 

     // The data members are inaccessible (private), so 
     // they can't be accessed like this: 
     // string n = e.name; 
     // double s = e.salary; 

     // 'name' is indirectly accessed via method: 
     string n = e.GetName(); 

     // 'salary' is indirectly accessed via property 
     double s = e.Salary; 
    } 
} 
+3

你爲什麼要使用的方法不是屬性有用對於'Name',爲什麼你的二傳手沒有設置任何東西?這是一個非常奇怪的例子。 – 2013-04-30 15:02:18

+0

謝謝,Jon提出這個問題。我實際上從這裏抓住了這個例子:http://msdn.microsoft.com/en-us/library/st6sy9xe.aspx – Athapali 2013-04-30 15:04:04

+0

我建議你閱讀維基百科封裝[link](http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)) – Tombala 2013-04-30 15:05:29

回答

0

如果你問什麼是具有公共get/set訪問時,你可以只是使實際現場公衆的角度來看,這是因爲你有自由隨後更改類的私有實現的那場,無需更改客戶端代碼。例如,你可以添加一個檢查,如果setter獲得有效的輸入,或者甚至完全改變private字段的數據類型,但是在setter中正確轉換它。

編輯:

如在評論中提到

SetName(),爲奇數加法。它實際上應該改變名稱(並帶一個參數),而不是返回一個字符串。

3

通過使用protected關鍵字,可以限制屬性或方法在聲明該屬性的類內以及從聲明此成員的類派生的任何類內都可訪問。 (MSDN)

class Employee2 
{ 
    private string name = "Harry Potter"; 
    private double salary = 100.0; 

    protected string GetName() 
    { 
     return name; 
    } 

    protected string SetName(string newName) 
    { 
     this.name = newName; 
    } 

    protected double Salary 
    { 
     get { return salary; } 

    } 
} 
0

封裝意味着對象的內部表示通常在對象定義之外隱藏在視圖之外。通常情況下,只有對象本身的方法可以直接檢查或操縱其字段

 private decimal accountBalance = 500.00m; 

     public decimal CheckBalance() 
      { 
      return accountBalance; 
      } 

,並在那裏獲取和設置都是對對象成員的值的變化觸發事件,而