假设我有一个电话号码,我的课程需要验证和跟踪,大多数情况下,电话号码只是一个字符串,因此在尝试干掉时,只需创建一个Phone类并继承字符串。既然我不能做到那么下一个最好的方法是什么?添加一个字符串作为私有成员并重载等于/ =运算符,以便它可以传递并设置为字符串?
答案 0 :(得分:7)
更喜欢构图而不是继承。
您希望您的电话号码可以从字符串中分配吗?当然不是因为以下是可能的:
Person.PhoneNumber = "FOO"
这样的事情感觉更自然:
Person.PhoneNumber = new PhoneNumber("015-123456");
你可以在构造函数中进行自定义验证,并且另外决定你希望它是不可变的(好吧,字符串也是不可变的)
答案 1 :(得分:2)
简而言之,是的,有一个私人会员。但是,我建议使用静态解析成员而不是重载赋值。
PhoneNumber p = PhoneNumber.Parse("704 - 576- 4000");
这更标准,更具可读性。即使你可以继承字符串,我也会建议不要使用它,因为String具有复杂的内部功能,应该与你的类分开。同样继承自字符串会暴露许多对电话号码没有意义的方法(即:Concat,不准确的比较等)。
答案 2 :(得分:1)
我会按照你的建议用私有字符串成员创建PhoneNumber类。如果要提供一致的格式(例如(123)123-1234或其他),可以覆盖ToString()方法,可以在set方法或构造函数上添加一些验证,以确保电话号码有10位数(如果一个北美号码。
如果需要,创建PhoneNumber类允许您稍后扩展该类。例如,您可以增强电话号码验证以检查无效的区号,如果区号不存在则引发错误。
答案 3 :(得分:1)
我建议您接受Johannes Rudolph或C. Ross的建议。您还可以查看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);
}
}