2009-10-14 79 views
1

可以說我有一個電話號碼,我的類需要驗證和跟蹤和大多數情況下,電話號碼只是一個字符串,所以試圖做一個乾的人只會創建一個電話類和從字符串繼承。既然我不能那麼做下一個最好的方法?添加一個字符串作爲私人成員並重載equal/=運算符,以便它可以傳遞並設置爲字符串?從密封類繼承

回答

1

我可以建議你拿約翰內斯魯道夫或C.羅斯的建議。您還可以查看implicit關鍵字的行爲,該關鍵字可讓您在執行驗證的同時以類似字符串的方式進行分配。

即:

public class PhoneNumber { 

    private String number; 

    public PhoneNumber(String s) { 
     // validation code here, throw exception if not valid 
     number = s; 
    } 

    public static implicit operator PhoneNumber(String s) { 
     return new PhoneNumber(s); 
    } 
} 
7

比繼承更喜歡構圖。

你想讓你的電話號碼可以從字符串中分配嗎?當然不是,因爲以下將有可能再:

Person.PhoneNumber = "FOO" 

像這樣感覺更自然:

Person.PhoneNumber = new PhoneNumber("015-123456"); 

你可以自定義驗證在構造和additionaly決定你希望它是不可變的(OK ,字符串將是不可變的)

+0

我的理解是,服用Person.PhoneNumber = 「foo」 和拋出異常是一個更好的做法則Person.PhoneNumber =新******中國( 「FOO」);拋出一個構造函數的異常。但這可能只是我的C++背景鈴聲。 – 2009-10-14 18:46:27

+0

您的響鈴通常是正確的,但我們在GC環境中工作,因此不成功的對象創建不成問題。您還可以將Person.PhoneNumber構造函數設爲私有的,並提供一個靜態的PhoneNumber.Parse方法,該方法負責創建PhoneNumber實例並驗證字符串。 – 2009-10-15 06:51:22

1

我會創建PhoneNumber類與私人字符串成員,因爲你建議。如果你想提供一致的格式(例如(123)123-1234或其他),你可以重寫ToString()方法,你可以在set方法或構造函數上添加一些驗證,以確保電話號碼有10位數字北美數字)。

創建一個PhoneNumber類允許您稍後在需要時擴展該類。例如,您可以增強您的電話號碼驗證,以檢查無效區號並在區號不存在時引發錯誤。

2

總之,是的,有私人會員。然而,而不是重載分配,我會建議有一個靜態分析成員。

PhoneNumber p = PhoneNumber.Parse("704 - 576- 4000"); 

這更標準,更具可讀性。即使你可以從字符串繼承,我建議不要這樣做,因爲String具有複雜的內部功能,應該與你的類分開。從字符串繼承將暴露一些方法,這對電話號碼沒有意義(即:Concat,不準確的比較等)。