继承密封类

时间:2009-10-14 17:44:24

标签: .net oop

假设我有一个电话号码,我的课程需要验证和跟踪,大多数情况下,电话号码只是一个字符串,因此在尝试干掉时,只需创建一个Phone类并继承字符串。既然我不能做到那么下一个最好的方法是什么?添加一个字符串作为私有成员并重载等于/ =运算符,以便它可以传递并设置为字符串?

4 个答案:

答案 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);
    }
}