2015-04-26 98 views
-2

我開始爲年底的項目編寫一個Person類,我從以前的項目中找到了一個基本的getset屬性,但是它在UML註釋中說該方法當前沒有保護。設置方法不受保護,我如何保護它?

將「public」更改爲「Protected」會很簡單嗎?或者我錯過了什麼?

//PROPERTIES 

    /// <summary> 
    /// Property for "Title" 
    /// Read & Write property for attribute "Title" 
    /// set method currently has no protection 
    /// </summary> 
    /// 
    public string Title 
    { 
     get { return title; } 
     set { title = value; } 
    } 

    public string FirstName 
    { 
     get { return firstname; } 
     set { firstname = value; } 
    } 

    public string MiddleName 
    { 
     get { return middlename; } 
     set { middlename = value; } 
    } 

    public string LastName 
    { 
     get { return lastname; } 
     set { lastname = value; } 
    } 

PS。我在一個基本的OOP課程中,它是非常簡單的代碼(我的項目只需要一個屬性:P),我從未在get/set之前使用驗證,我會研究它,但我認爲:

"protected set {title = value; }"

正是我一直在尋找。

+5

這取決於撰寫該評論的人的「保護」的*定義*。它是否具有*無效輸入*,*無效使用*或*其他*的保護功能?如果他們希望'set'方法不能在課堂外使用,請使用'protected set'。 –

+0

你能發佈全班嗎?我想我知道他們希望你做什麼,但我需要看完全班才能確認。 –

+1

我在代碼中編輯了問題的文本並刪除了指向圖片的鏈接。您將來應該使用文本來表示代碼而不是屏幕截圖。謝謝! – jdphenix

回答

1

在C#中,你可以有getter和setter方法不同的保護:

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

這將允許任何類讀取名稱,但唯一的人或衍生工具來寫。這裏我使用了一個自動屬性,但是類似的構造可以用於後臺字段。

+4

從問題來看,OP是否指字面上的「受保護」屬性或其他一些概念並不明確。 – jdphenix

+0

不知道你可以單獨給保護一個get/set,謝謝你! –

+0

同意 - 應該澄清關於保護的意見是否意味着在設置者中沒有驗證,或者設置者應該被「保護」 –

3

從這個

/// set method currently has no protection 
public string Title 
{ 
    get { return title; } 
    set { title = value; } 
} 

我猜想,保護不是關於protected訪問修飾符,但有關數據驗證。

驗證可以採取許多不同的形式,一種可能的形式看起來像

public string Title 
{ 
    get { return title; } 
    set 
    { 
     if (value == title) 
      return; 
     if (string.IsNullOrEmpty(value)) 
      throw new ArgumentException("Title"); 
     title = value; 
    } 
} 
+0

值==如果value爲null,title將拋出一個NullReferenceException。等於(價值,標題)通常是更好的財產平等模式。 – Holstebroe

+0

@Holstebroe - 不,它不會扔,試試吧。並不是更好,Equals()是非常非常少需要的,但是現在每個人都在用它來污染他們所有的代碼。一直使用它會使其失去信號功能。 –

+0

你說得對。只有operator ==被重載時,==纔會拋出異常而不是字符串。 – Holstebroe

0

要保護從外部突變類的數據。在OOP的說法中,這被稱爲encapsulation

考慮以下代碼片段:

sealed class Person { 
    public Person(string name) { 
     this.name = name; 
    } 

    public string Name { get; private set; } 
} 
  • Person實例不能從外部突變。因爲它是Person的實例是不可變的。使用Person沒有
  • 從上面導出,代碼擔心冒着編輯Person

    Person p = new Person('Bob'); p.Name = 'Sally' // won't work, set is not accessible

其他說明:

你可能不想從字面上protected。它的用例是當你有一個用於繼承的類時。如果您在數據模型中代表人員,則不想使用它。

在您的意見中,你聲明你想從一個Person派生一個類Address。這是一種不適當的關係。考慮這個簡單的英語句子。

地址也是一個人。

廢話吧?這個怎麼樣:

一個人有一個地址。

更有意義。 More related reading

因此,從這個意義上說,你會建立HAS-A關係的組成 - 一個地址將是一個Person的成員。

sealed class Person { 
    public Address HomeAddress {get; private set;} 

    //.. and other members 
} 

一遍,一個Person實例外的代碼不能發生變異的地址*上述建立,和一個Person具有Address,這是有意義的在這方面。

*這是對的,因爲HomeAddress引用是從外部不可改變的,但它指向的Address對象不是。爲了避免混淆和後來的FUBAR,請確保Address也是不可變的。