2012-01-07 42 views
1

我在Head First C#書中練習。C#封裝(獲取和設置)

這段代碼應該是關於封裝的。

class DinnerParty 
{ 
    private int NumberOfPeople; 
     .... 

    public void SetPartyOptions(int people, bool fancy) { 
     NumberOfPeople = people; 
     ..... 
    } 

    public int GetNumberOfPeople() { 
     return NumberOfPeople; 
    } 
} 

form1

public partial class Form1 : Form 
{ 
    DinnerParty dinnerParty; 
    public Form1() 
    { 
     InitializeComponent(); 

     dinnerParty = new DinnerParty() {NumberOfPeople = 5 }; 

     ... 

這是假設的工作?

Visual Studio向我顯示一個錯誤。 (由於其保護級別而無法訪問)

我對此很新穎。

感謝

+0

此代碼將無法正常工作,因爲'private' – zerkms 2012-01-07 11:22:43

回答

0

沒有,這不應該工作。我看不到這本書,所以我不能評論上下文。然而:

public int NumberOfPeopoe {get;set;} 

是一個合理的修復。

+0

不,這不是。這意味着我現在可以直接設置NumberOfPeople,我應該只能通過他提供的方法來完成。 – AlanFoster 2012-01-07 11:28:42

+0

@Alan該問題提供了兩個相互衝突的用途;它也呈現成員分配。如果這是爲了工作,我們有兩種選擇:公共場所或公共場所。例如,有一個'GetNumberOfPeople()'方法不是慣用的c#(其中一個屬性獲取看起來更典型) – 2012-01-07 11:30:40

+0

它是第一個私有的int NumberOfPeople ;.當時它工作。但該書要求我將其更改爲「Private」,然後添加get和set方法。它現在不起作用。 – gripmYgrip 2012-01-07 11:41:36

0

你可以通過編寫像使用的 「Fluent interface」 的理念:

class DinnerParty 
{ 
    private int NumberOfPeople; 

     .... 

    public DinnerParty SetPartyOptions(int people, bool fancy) { 
     NumberOfPeople = people; 
     ..... 

     return this; // Return own instance to allow for further accessing. 
    } 

    public int GetNumberOfPeople() { 
     return NumberOfPeople; 
    } 
} 

然後調用它:

public partial class Form1 : Form 
{ 
    DinnerParty dinnerParty; 
    public Form1() 
    { 
     InitializeComponent(); 

     dinnerParty = new DinnerParty().SetPartyOptions(5, true); 

     ... 
0

NumberOfPeople是一個私有成員和你不能用班級夥計

0

NumberOfPeople is p內臟,所以它不會工作。這裏最好的解決方案是創建公共屬性而不是私有字段或添加構造函數並在此處初始化此字段。

1

這是因爲NumberOfPeopleprivate意味着它不能從類DinnerParty以外訪問,所以你需要使它public

0

您不能初始化您的作用域(類)之外的私有字段。

讓它成爲一個屬性。

public int NumberOfPeople { get; set; } 

,現在,這將工作

dinnerParty = new DinnerParty() { NumberOfPeople = 5 };