可以說我有一個電話號碼,我的類需要驗證和跟蹤和大多數情況下,電話號碼只是一個字符串,所以試圖做一個乾的人只會創建一個電話類和從字符串繼承。既然我不能那麼做下一個最好的方法?添加一個字符串作爲私人成員並重載equal/=運算符,以便它可以傳遞並設置爲字符串?從密封類繼承
Q
從密封類繼承
1
A
回答
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 ,字符串將是不可變的)
1
我會創建PhoneNumber類與私人字符串成員,因爲你建議。如果你想提供一致的格式(例如(123)123-1234或其他),你可以重寫ToString()方法,你可以在set方法或構造函數上添加一些驗證,以確保電話號碼有10位數字北美數字)。
創建一個PhoneNumber類允許您稍後在需要時擴展該類。例如,您可以增強您的電話號碼驗證,以檢查無效區號並在區號不存在時引發錯誤。
2
總之,是的,有私人會員。然而,而不是重載分配,我會建議有一個靜態分析成員。
PhoneNumber p = PhoneNumber.Parse("704 - 576- 4000");
這更標準,更具可讀性。即使你可以從字符串繼承,我建議不要這樣做,因爲String具有複雜的內部功能,應該與你的類分開。從字符串繼承將暴露一些方法,這對電話號碼沒有意義(即:Concat,不準確的比較等)。
相關問題
- 1. 有從密封類繼承的替代方法嗎?
- 2. C++中的密封類和虛擬繼承
- 3. 從2類繼承
- 4. 繼承。從父類
- 5. 從葉類繼承
- 6. 繼承或封裝View/Viewmodel
- 7. C#繼承封裝代碼
- 8. 封裝和繼承方法
- 9. Javascript:繼承封裝變量
- 10. Flash封裝和繼承
- 11. 從JS類繼承Dart類?
- 12. 從Java類繼承的Kotlin類是否也從Any繼承?
- 13. 公開從基類繼承,從派生的類私有繼承
- 14. 從類繼承從列表
- 15. 從基類演變爲可繼承類繼承類
- 16. 繼承Python類繼承docstrings
- 17. 其他繼承類中的繼承類
- 18. 類可以從「參數」類繼承嗎? (有條件繼承)
- 19. 如何從另一個繼承類的繼承類的說話
- 20. 當我想要繼承和添加屬性時如何處理密封類
- 21. 從元類繼承方法
- 22. SQLAlchemy從非orm類繼承
- 23. 從模板類繼承
- 24. 從非抽象類繼承
- 25. 呼叫從繼承類
- 26. TestNG從父類繼承@Parameters
- 27. 多級繼承:從子類
- 28. 如何從Qt類繼承?
- 29. 繼承類從對象
- 30. 不能從基類繼承
我的理解是,服用Person.PhoneNumber = 「foo」 和拋出異常是一個更好的做法則Person.PhoneNumber =新******中國( 「FOO」);拋出一個構造函數的異常。但這可能只是我的C++背景鈴聲。 – 2009-10-14 18:46:27
您的響鈴通常是正確的,但我們在GC環境中工作,因此不成功的對象創建不成問題。您還可以將Person.PhoneNumber構造函數設爲私有的,並提供一個靜態的PhoneNumber.Parse方法,該方法負責創建PhoneNumber實例並驗證字符串。 – 2009-10-15 06:51:22